Предисловие: Мой вопрос в основном является алгоритмическим вопросом, поэтому, даже если вы не знакомы с суффиксами и массивами LCP, вы, вероятно, можете мне помочь.Понимание алгоритма для сопоставления шаблонов с использованием массива LCP
В статье this описано, как эффективно использовать суффикс и массивы LCP для сопоставления строк.
я понял SA и LCP работу и как время выполнение алгоритма может быть улучшено с O(P*log(N))
(где P
является длиной паттерна и N
является длиной строки) для O(P+log(N))
(Спасибо Криса Eelmaa отвечает here и jogojapans ответить here).
Я пытался использовать алгоритм на рисунке 4, который объясняет использование LLcp
и RLcp
. Но у меня проблемы с пониманием того, как это работает.
Алгоритм (из the source):
Объяснение используемых имен переменных:
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
Теперь я хочу попробовать алгоритм, используя следующий пример (частично взяты из here):
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)
.
Вы должны рассчитать 'lcp (v, w)' самостоятельно, вы не можете вывести это из предварительно вычисленных массивов - любой lcp, содержащий входную строку, займет время. Вот откуда берется P в 'P + logN'. Что касается «ступенчатого алгоритма» - это интересно. Однажды я посмотрю. –
Ваша ошибка в том, что вы предполагаете, что w1 относится к первому символу в W. Это не так. Это на самом деле второй символ в W, который сделал бы это так: 'a '<=' a'', который оценивает true. –
Но это не 'w1', это' wl' с 'l = 0', и поэтому первый символ в W (т. Е.' Wl = 'b'') – Paddre