Функция вывода для алгоритма Aho-Corasick

У меня проблема с реализацией функции вывода для алгоритма Aho-Corasick. В общем, я не совсем понимаю, как работает функция вывода. В соответствии с этой статьей в функции goto я помещаю соответствующий индекс шаблона для вывода, например output[currentState] = patternIndex;в функции сбоя я объединяю существующий вывод для состояния S с выводом для сбойного состояния S, например output[s] += output[fail[s]]; в функции поиска я использую такое условие: if (output[state]) != 0) then we find our pattern. Но такой подход не работает, и я получил глупый результат. Возможно, псевдокод для функции вывода означает что-то еще в этой статье, я не знаю.

Функция вывода с побитовым отображением, которая у меня здесь, также не работает правильно в большинстве случаев. Неправильные шаблоны соответствуют этому условию if ((output[currentState] & (1 << j)) != 0)Кроме того, я не совсем понимаю, почему побитовые операции используются для вычисления выхода.

Буду благодарен за любую помощь в разъяснении реализации функции вывода.

EDIT1: кажется, что проблема была в переполнении после операции сдвига битов: output[currentState] |= (1 << i);а также out[currentState] & (1 << j)Пока что пытался использовать BigInteger, но, похоже, это вызывает проблемы с производительностью.

EDIT2: пробовал BitSet, но производительность все еще очень плохая. Может быть, есть проблема в реализации алгоритма, я не знаю.

1 ответ

32-битная битовая операция, как показано ниже

шаблон: he, she, his, hers

input: shethehishetheehershehehishe

Общее состояние номер 9, а также 2, 5, 7, 9 состояние является конечным состоянием, как показано ниже автоматизации переменного тока

Выходная функция представляет собой шаблон, который вы сопоставили в текущем состоянии. лайк:

out[2] = he, out[5] = she/he, out[7] = his, out[9] = hers

The code "out[currentState] |= (1 << i)" just like below 

out[2] = 0000 0000 0000 0000 0000 0010 <-- means number 1(he) pattern matched 

out[5] = 0000 0000 0000 0000 0000 0110 <-- means number 1(he) and number 2(she) matched

так что пользуйтесь output[currentState] & (1 << j) рассчитать, какой шаблон соответствует.

Эта операция, как горячая кодировка. И проблема операции - тип выходной функции. Если тип выходной функции 32 биты, и мы можем просто искать не более 31 узоры. Потому что над 31 шаблоны, он будет переполнен смещением.

Другие вопросы по тегам