Изменения

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

Алгоритм Райта

15 байт убрано, 16:43, 27 марта 2016
Псевдокод
==Псевдокод==
Побочные функции
'''int''' findFirst('''char'''[] y, '''int''' fromIndex, '''int''' toIndex, '''char''' symbol)
'''for''' (i = fromIndex .. toIndex)
'''if''' (y[i] == symbol)
'''return''' i
'''return''' -1
'''boolean''' restEquals('''char'''[] y, '''int''' fromIndex, '''char'''[] x, '''int''' toIndex)
'''for''' (i = fromIndex .. toIndex)
'''if''' (y[i] != x[i - fromIndex + 1])
'''return''' false
'''return''' true
'''void''' RAITAСтадия препроцессинга ('''char'''совпадает со стадией препроцессинга в [[Алгоритм Бойера-Мура|алгоритме Бойера-Мура]] x, ) '''int''' m, [] preBmBc('''char'''[] yx, '''int''' nm) { '''int'''[] bmBc '''char''' c, firstCh, middleCh, lastCh; '''if''' (m result == 0) '''returnint'''[ASIZE] '''else if''' (m == 1) { <font color=green>//Проверка на случай поиска вхождения одного символаГде ASIZE {{---}} размер алфавита</font> '''intfor''' match (i = 0 '''while''' (match < n.. ASIZE - 1) { match = findFirst(y, match, n - 1, x result[0i])= m; '''iffor''' (match !i = 0 .. m -12) { '''print'''(match) } '''else''' '''print'''(<font color result[x[i]] =green>"No matches"</font>)m - i - 1; '''return'''result } }Основная стадия алгоритма '''intvoid''' findFirstRAITA('''char'''[] yx, '''int''' fromIndexm, '''intchar''' toIndex[] y, '''charint''' symboln){ '''for''' (i = fromIndex .. toIndex){ '''ifint''' (y[i] == symbol){bmBc '''return''' i } } '''return''' -1 } '''boolean''' restEquals( '''char'''[] yc, '''int''' fromIndexfirstCh, '''char'''[] xmiddleCh, lastCh; '''intif''' toIndex(m == 0){ '''forreturn''' (i = fromIndex .. toIndex){ '''else if''' (y[i] !m == x[i - fromIndex + 1]){ '''return''' false } } '''return''' true } <font color=green> //Стадия препроцессингаПроверка на случай поиска вхождения одного символа</font> '''int'''[] preBmBc(match = 0 '''charwhile'''(match < n) match = findFirst(y, match, n - 1, x[0] x, '''int''' m) { '''intif'''[] result (match != -1) '''intprint'''[m](match) '''forelse''' (i = 0 .. m - 1){ result[i] = m; } '''forprint''' (i <font color= 0 .. m - 2green>"No matches"</font>){ result[x[i]] = m - i - 1; } '''return''' result } bmBc = preBmBc (x, m) firstCh = x[0]; middleCh = x[m/2]; lastCh = x[m - 1]; <font color=green>//Поиск</font> '''int''' j = 0 '''while''' (j <= n - m) { c = y[j + m - 1] '''if''' (lastCh == c && middleCh == y[j + m / 2] && firstCh == y[j] && restEquals(y, j + 1, x, j + m - 2)){ '''print'''(j) '''return''' } j += bmBc[c]; } '''print'''(<font color=green>"No matches"</font>) }
==Асимптотика==
317
правок

Навигация