Изменения

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

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

208 байт убрано, 14:44, 27 апреля 2016
Псевдокод
'''function''' twoWaySearch(String pattern, String text):
<font color=green>//предобработка <tex>-</tex> вычисление критической позиции (в которой строка делится на <tex>u</tex> и <tex>v</tex>)</font>
<tex>\langle</tex>l1, p1<tex>\rangle</tex> <tex>\leftarrow</tex> = maxSuffix(pattern, <tex>\leqslant</tex>) <tex>\langle</tex>l2, p2<tex>\rangle</tex> <tex>\leftarrow</tex> = maxSuffix(pattern, <tex>\geqslant</tex>)
'''if''' l1 <tex>\geqslant</tex> l2
l = l1
<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
'''while''' pos + pattern.length <tex>\leqslant</tex> text.length
<font color=green>//первый этап: просмотр <tex>v</tex> слева направо</font>
i = <tex>\leftarrow \max</tex>(l, memPrefix) + 1
'''while''' i <tex>\leqslant</tex> pattern.length '''and''' pattern[i] <tex>=</tex> text[pos + i]
i++
'''if''' i <tex>\leqslant</tex> pattern.length
pos <tex>\leftarrow</tex> = pos + <tex>\max</tex>(i <tex>-</tex> l, memPrefix <tex>-</tex> p <tex>+</tex> 1) memPrefix <tex>\leftarrow</tex> = 0
'''else'''
<font color=green>//второй этап: просмотр <tex>u</tex> справа налево</font>
j <tex>\leftarrow</tex> = l
'''while''' j <tex> > </tex> memPrefix '''and''' pattern[j] <tex>=</tex> text[pos + j]
j--
'''if''' j <tex>\leqslant</tex> memPrefix
occurences = pos <tex>\rightarrow</tex> occurences pos <tex>\leftarrow</tex> = pos <tex>+</tex> p memPrefix <tex>\leftarrow</tex> = pattern.length <tex>-</tex> p
'''return''' occurences
Анонимный участник

Навигация