Понимание алгоритма сопоставления с образцом с использованием массива LCP

Предисловие: Мой вопрос в основном связан с алгоритмами, поэтому, даже если вы не знакомы с суффиксами и массивами LCP, вы, вероятно, сможете мне помочь.

В этой статье описывается, как эффективно использовать массивы суффиксов и LCP для сопоставления строковых шаблонов.

Я понял работу SA и LCP и то, как можно улучшить время выполнения алгоритма с O(P*log(N)) (где P — длина шаблона, а N — длина строки) до O(P+log(N)) (благодаря ответу Криса Элмаа здесь и ответ jogojapans здесь).

Я пытался пройти алгоритм на рисунке 4, который объясняет использование LLcp и RLcp. Но у меня проблемы с пониманием того, как это работает.

Алгоритм (взято из источника):

Алгоритм сопоставления с образцом

Объяснение используемых имен переменных:

lcp(v,w) : Length of the longest common prefix of v and w
W = w0..wP-1 : pattern of length P
A = a0..aN-1 : the text (length N)
Pos[0..N-1] : suffix array
L_W : index (in A) of first occurrence of the matched pattern
M : middle index of current substring
L : lower bound
R : upper bound
Lcp : array of size N-2 such that Lcp[M] = lcp(A_Pos[L_M], A_pos[M]) where L_M is the lower bound of the unique interval with M in the middle
Rcp : array of size N-2 such that Rcp[M] = lcp(A_Pos[R_M], A_pos[M]) where R_M is the upper bound of the unique interval with M in the middle

Теперь я хочу попробовать алгоритм, используя следующий пример (частично взятый из здесь):

 SA | LCP | Suffix entry
 -----------------------
 5  | N/A | a  
 3  | 1   | ana  
 1  | 3   | anana  
 0  | 0   | banana  
 4  | 0   | na  
 2  | 2   | nana 

A = "banana" ; N = 6
W = "ban" ; P = 3

Я хочу попытаться сопоставить строку, скажем, ban, и ожидаю, что алгоритм вернет 0 как L_W.

Вот как я бы прошёл алгоритм:

l = lcp("a", "ban") = 0
r = lcp("nana", "ban") = 0
if 0 = 3 or 'b' =< 'a' then // which is NOT the case for both conditions
    L_W = 0
else if 0 < 3 or 'b' =< 'n' then // which is the case for both conditions 
    L_W = 6 // which means 'not found'
...
...

Я чувствую, что мне чего-то не хватает, но я не могу понять, что. Также мне интересно, как можно использовать предварительно вычисленный массив LCP вместо вызова lcp(v,w).


person Paddre    schedule 11.02.2015    source источник
comment
Вы должны вычислить lcp(v, w) самостоятельно, вы не можете вывести это из предварительно вычисленных массивов - любое lcp, включающее входную строку, потребует времени. Вот откуда взялась буква P в P + logN. Насчет step through algorithm - это интересно. Я посмотрю это один день.   -  person Erti-Chris Eelmaa    schedule 11.02.2015
comment
Ваша ошибка в том, что вы предполагаете, что w1 относится к первому символу в W. Это не так. На самом деле это второй символ в W, что делает его таким: 'a' <= 'a', который оценивается как истина.   -  person Erti-Chris Eelmaa    schedule 11.02.2015
comment
Но это не w1, это wl с l=0 и, следовательно, первый символ в W (то есть wl = 'b')   -  person Paddre    schedule 12.02.2015
comment
Да, ты прав. На данный момент у меня нет объяснений. Я взглянул на реализацию PlogN, и это имело смысл - P+logN не так уж и много.   -  person Erti-Chris Eelmaa    schedule 12.02.2015


Ответы (1)


Я считаю, что произошла ошибка.

Первое условие довольно легко понять. Когда длина LCP == длине шаблона, это делается. Когда ваш образец даже меньше или равен самому маленькому, тогда единственным выбором является наименьший.

Второе условие неверно. Мы можем доказать это от противного. г ‹ П || Wr ‹= a... означает r >= P && Wr > a... Если r >= P, то как мы можем иметь Lw = N(не найдено), если у нас уже есть общий префикс длины r?

person LeeLee    schedule 15.04.2018
comment
Спасибо за лаконичный ответ. - person Paddre; 16.04.2018
comment
@Paddre Спустя 3 года ты все еще помнишь этот вопрос. WOW~ Вы успешно запустили этот алгоритм? У меня серьезная проблема. Алгоритм LCP-LR от Erti-Chris Eelmaa на самом деле совершенно неверен. Во-первых, диапазон min от [a,b] = lcp от [a, b+1]. Алгоритм Криса использует range-min вместо lcp. Во-вторых, левый и правый поддиапазоны должны перекрываться на 1 единицу в средней точке. - person LeeLee; 17.04.2018