Изменения

Перейти к: навигация, поиск

Двусторонний алгоритм

378 байт убрано, 00:44, 16 июня 2015
Менее адский псевдокод, комментарии
'''function''' twoWaySearch(String pattern, String text):
n <font color= pattern.lengthgreen>//предобработка <tex>-</tex> вычисление критической позиции (в которой строка делится на <tex>u</tex> и <tex>v</tex>)</font> <tex>\langle</tex>len1l1, p1<tex>\rangle</tex> <tex>\leftarrow</tex> maxSuffix(pattern, <tex>\leqslant</tex>) <tex>\langle</tex>len2l2, p2<tex>\rangle</tex> <tex>\leftarrow</tex> maxSuffix(pattern, <tex>\geqslant</tex>) '''if''' len1 l1 <tex>\geqslant</tex> len2l2 len l = len1l1
p = p1
'''else'''
len = len2l2
p = p2
<font color=green>//<tex>p</tex> <tex>-</tex> период <tex>x</tex>, <tex>l</tex> <tex>-</tex> такая критическая позиция, что <tex>l<p</tex></font>
occurences = <tex>\varnothing</tex>
pos <tex>\leftarrow</tex> 0
memPrefix <tex>\leftarrow</tex> 0
'''if''' len < n/2 '''andwhile''' pos + pattern[1.length <tex>\ldotsleqslant</tex>len] text.length <texfont color=green>-</tex> суффикс pattern[len + 1/первая фаза: просмотр <tex>\ldotsv</tex>len + p] '''while''' pos + n <tex>\leqslantслева направо</texfont> text.length i <tex>\leftarrow \max</tex>(l, memPrefix) + 1 '''while''' i <tex>\leqslant</tex> n pattern.length '''and''' pattern[i] <tex>=</tex> text[pos + i] i++ '''if''' i <tex>\leqslant</tex> npattern.length pos <tex>\leftarrow</tex> pos + <tex>\max</tex>(i <tex>-</tex> lenl, memPrefix <tex>-</tex> p <tex>+</tex> 1) memPrefix <tex>\leftarrow</tex> 0 '''else''' j <tex>\leftarrow</tex> l '''while''' j <tex> > </tex> memPrefix '''and''' pattern[j] <tex>font color=</tex> text[pos + j] j-- '''if''' j <tex>\leqslant</tex> memPrefix pos <tex>\rightarrow</tex> occurences pos <tex>\leftarrow</tex> pos <tex>+</tex> p memPrefix <tex>\leftarrow</tex> n <tex>-</texgreen> p '''else''' q <tex>\leftarrow \max</tex>(len, n <tex>-</tex> len) вторая фаза: просмотр <tex>+u</tex> 1 '''while''' pos + n <tex>\leqslantсправа налево</texfont> text.length i j <tex>\leftarrow</tex> len + 1l '''while''' i j <tex>\leqslant> </tex> n memPrefix '''and''' pattern[ij] <tex>=</tex> text[pos <tex>+</tex> ij] i++j-- '''if''' i j <tex>\leqslant</tex> nmemPrefix pos <tex>\leftarrowrightarrow</tex> pos <tex>+</tex> i <tex>-</tex> lenoccurences '''else''' j pos <tex>\leftarrow</tex> len '''while''' j <tex> > </tex> 0 '''and''' pattern[j] <tex>=</tex> text[pos <tex>+</tex> j]p j-- '''if''' j <tex>=</tex> 0 pos <tex>\rightarrow</tex> occurences pos memPrefix <tex>\leftarrow</tex> pos pattern.length <tex>+-</tex> qp
'''return''' occurences
74
правки

Навигация