Изменения

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

Алгоритм Ахо-Корасик

50 байт убрано, 16:07, 21 мая 2016
Пример реализации
'''Структура вершины:'''
'''struct''' Node:
'''Node*''' son[SZ] <font color=green>// массив сыновей; SZ - это размер алфавита</font> '''Node*''' go[SZ] <font color=green>// массив переходов (запоминаем переходы в ленивой рекурсии)</font> '''Node*''' parent <font color=green>// вершина родитель</font> '''Node*''' suffLink <font color=green>// суффиксная ссылка (вычисляем в ленивой рекурсии)</font> '''Node*''' up <font color=green>// сжатая суффиксная ссылка</font>
'''char''' charToParent <font color=green>// символ, ведущий к родителю</font>
'''bool''' isLeaf <font color=green>// флаг, является ли вершина терминалом</font>
'''Функция, для вычисления суффиксной ссылки:'''
'''Node*''' getSuffLink('''Node*''' v): '''if''' '''not'''(v->.suffLink) <font color=green>// если суффиксная ссылка ещё не вычислена</font> '''if''' v == root '''or''' v->.parent == root v->.suffLink = root
'''else'''
v->.suffLink = getGo(getSuffLink(v->.parent), v->.charToParent) '''return''' v->.suffLink
'''Функция, для вычисления перехода:'''
'''Node*''' getGo('''Node*''' v, '''char''' c): '''if''' '''not'''(v->.go[c]) <font color=green>// если переход по символу c ещё не вычислен</font> '''if''' v->.son[c] v->.go[c] = v->.son[c]
'''else''' '''if''' v == root
v->.go[c] = root
'''else'''
v->.go[c] = getGo(getSuffLink(v), c) '''return''' v->.go[c]
'''Функция, для вычисления сжатой суффиксной ссылки:'''
'''Node*''' getUp('''Node*''' v): '''if''' '''not'''(v->.up) <font color=green>// если сжатая суффиксная ссылка ещё не вычислена</font> '''if''' getSuffLink(v)->.isLeaf v->.up = getSuffLink(v)
'''else''' '''if''' getSuffLink(v) == root
v->.up = root
'''else'''
v->.up = getUp(getSuffLink(v)) '''return''' v->.up
'''Функция, для добавление строки в бор:'''
'''fun''' addString('''string const&''' s, '''int''' patternNumber):
'''Node*''' cur = root
'''for''' i = 0 '''to''' s.length - 1
'''char''' c = s[i] - 'a'
'''if''' cur->.son[c] == 0 cur->.son[c] = Node
<font color=green>/* здесь также нужно обнулить указатели на переходы и сыновей */</font>
cur->.son[c]->.suffLink = 0 cur->.son[c]->.up = 0 cur->.son[c]->.parent = cur cur->.son[c]->.charToParent = c cur->.son[c]->.isLeaf = ''false'' cur = cur->.son[c] cur->.isLeaf = ''true'' cur->.leafPatternNumber.push_back(patternNumber)
'''Функция, для процессинга текста (поиск, встречается строка или нет):'''
'''fun''' processText('''string const&''' t, '''vector<bool>&''' found): <font color=green>// found - это вектор, длина которого равна количеству строк</font>
found.assign(w, ''false'') <font color=green>// w - количество строк</font>
'''Node*''' cur = root
'''for''' i = 0 '''to''' t.length - 1
'''char''' c = t[i] - 'a'
cur = getGo(cur, c)
'''for''' j = 0 '''to''' cur->.leafPatternNumber.size - 1 found[cur->.leafPatternNumber[j]] = ''true''
<font color=green>/* В этом месте кода должен выполняться переход по '''сжатой''' суффиксной ссылке getUp(cur). Для вершины,
обнаруженной по ней тоже ставим, что она найдена, затем повторяем для её сжатой суффиксной ссылки
Анонимный участник

Навигация