Применение конечных автоматов в программировании
Задача. По заданному регулярному выражению над алфавитом найти в тексте
наименьший префикс, содержащий слово из .
Решение. Строится регулярное выражение и для него — недетерминированный конечный автомат с -переходами. Пусть это будет автомат . Если при чтении текста построенным автоматом мы приходим в финальное состояние, то это означает, что мы прочитали префикс текста , содержащий слово из языка .
Алгоритм, моделирующий работу недетерминированного конечного автомата с -переходами на входном слове .
Оценим трудоемкость приведенного алгоритма. Пусть , тогда тело цикла
оценивается как , а тело цикла " " как и весь алгоритм имеет трудоемкость .
Анализируя алгоритм построения автомата с -переходами по регулярному выражению , легко установить следующие свойства:
- , где — длина выражения
с учетом скобок и символов операций;
- ;
- ;
- .
Учитывая приведенные свойства, можем теперь оценить алгоритм, моделирующий работу автомата , величиной .
Рассмотрим теперь задачу, частную по отношению к рассмотренной выше, полагая, что вместо регулярного выражения задано одно слово-образец .
Задача. Требуется найти вхождение заданного слова-образца
в слово-текст
или установить, что такого вхождения нет.
Определение.
По данному образцу определим функцию
следующим образом: — наибольший префикс слова , являющийся суффиксом слова .
Очевидно, что .
Утверждение 4.
Для любой строки и любого символа
.
Действительно, предположим, что
и , тогда , а будет префиксом и суффиксом строки , причем , что противоречит определению .
Утверждение 5.
Пусть , тогда для любого символа
.
Действительно, по предыдущему утверждению, , поэтому значение не изменится, если от строки оставить последние символов, а именно . Построим по слову-образцу конечный автомат
где , , , а переходную функцию определим следующим образом:
Для построенного автомата, очевидно, будет справедливо следующее утверждение.
Утверждение 6.
Прочитав текст , автомат
будет находиться в состоянии .
Алгоритм вычисления функции переходов:
Время работы этого алгоритма .
Пример.
Пусть алфавит и . Допустим, что, читая текст , мы обнаружили некоторый префикс слова , заканчивающийся фрагментом , который является префиксом слова , а следующий символ в тексте не равен , то есть не совпадает с очередным символом слова . Считаем, что потерпели неудачу, но при этом заметим, что суффикс этого фрагмента является его префиксом и, возможно, он является префиксом некоторого вхождения слова в .
Делая такое предположение, продолжаем читать , сравнивая очередные символы слова с соответствующими, начиная с третьего, символами слова в надежде на этот раз обнаружить его вхождение в .
Таким образом, читая , будем считать, что мы в каждый момент находимся в некотором состоянии , если только что прочитан префикс слова длины . Если при чтении следующего символа мы терпим неудачу, то переходим в новое состояние , такое, что — максимальный префикс слова , являющийся его суффиксом. Функцию, которая состоянию ставит в соответствие , называют функцией откатов. В нашем примере ее можно изобразить следующей диаграммой.
Рис. 13.3.
Время работы этого алгоритма .
Пример.
Пусть алфавит и . Допустим, что, читая текст , мы обнаружили некоторый префикс слова , заканчивающийся фрагментом , который является префиксом слова , а следующий символ в тексте не равен , то есть не совпадает с очередным символом слова . Считаем, что потерпели неудачу, но при этом заметим, что суффикс этого фрагмента является его префиксом и, возможно, он является префиксом некоторого вхождения слова в .
Делая такое предположение, продолжаем читать , сравнивая очередные символы слова с соответствующими, начиная с третьего, символами слова в надежде на этот раз обнаружить его вхождение в .
Таким образом, читая , будем считать, что мы в каждый момент находимся в некотором состоянии , если только что прочитан префикс слова длины . Если при чтении следующего символа мы терпим неудачу, то переходим в новое состояние , такое, что — максимальный префикс слова , являющийся его суффиксом. Функцию, которая состоянию ставит в соответствие , называют функцией откатов. В нашем примере ее можно изобразить следующей диаграммой.
Рис. 13.3.
Введем необходимые обозначения. Пусть — непустое слово в некотором алфавите, а — наибольший собственный префикс слова , являющийся его суффиксом. Тогда справедливы следующие утверждения:
- Слова являются собственными префиксами и суффиксами слова .
- Последовательность
обрывается на пустом слове. - Любой префикс слова , являющийся его суффиксом, находится в последовательности
Пример.
Пусть . Тогда
Определение.
Функцией откатов для слова называют функцию , определяемую соотношением , где — префикс длины слова .
В нашем примере функция задается следующей таблицей:
Для разъяснения работы алгоритма рассмотрим ситуацию, возникшую при обработке слова на шаге . К этому моменту вычислены значения при :