поиск строк по ключевым словам: вопросы о «сбойной функции» - PullRequest
2 голосов
/ 27 апреля 2009

У меня есть вопрос об описании функции отказа из "Компиляторы: принципы, методы и инструменты", также называемые DragonBook

Во-первых, цитата:

Для быстрой обработки текстовых строк и поиска по ним по ключевому слову, Для ключевого слова b 1 b 2 ... b n полезно определить позицию s в этом ключевом слове, функцию сбоя f (s) ) ... Цель состоит в том, что b 1 b 2 .. - b f (s) - самый длинный правильный префикс b 1 ... b s , который также является суффиксом b 1 ... b s . Причина f (s) важна в том, что если мы пытаемся сопоставить текстовую строку для b l b 2 .. b n , и мы сопоставили первые s позиции, но затем мы терпим неудачу (то есть следующая позиция текстовой строки делает не удерживать b s + l ), тогда f (s) - самый длинный префикс b 1 .. b n , который может сопоставьте текстовую строку с той точкой, в которой мы находимся. Конечно, следующий персонаж текстовая строка должна быть b f (s) + 1 , иначе у нас все еще есть проблемы и мы должны рассмотреть еще более короткий префикс, который будет b f (f (s)) .

Итак, вопросы:
1. Если мы сопоставили s позиций с текстом, почему f (s) является самым длинным префиксом b 1 .. b n , который соответствует строка? Я думаю, s - это самый длинный префикс.
2. Следующий символ текстовой строки должен быть b f (s) + 1 , почему? У нас есть несоответствие в этой позиции, имеет ли значение вообще, что это за символ?

1 Ответ

2 голосов
/ 27 апреля 2009

f (s) - самый длинный префикс в этой позиции, который может соответствовать всему ключевому слову. Идея состоит не в том, чтобы попытаться сопоставить ключевое слово с текстом с самого начала, а в том, чтобы найти позицию, где появляется ключевое слово.

Рассмотрим поиск слова «аааба» в тексте «аааабаа». Совпадение не удается после трех первых а, но нет необходимости повторять со второго «а», так как мы знаем, что если следующая буква - это «б» (то есть), у нас может быть совпадение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...