Опубликован: 26.09.2006 | Доступ: свободный | Студентов: 1772 / 459 | Оценка: 4.25 / 4.12 | Длительность: 17:09:00
ISBN: 978-5-9556-0066-6
Специальности: Программист, Математик
Лекция 13:

Формальные языки

Введем необходимые обозначения. Пусть Y — непустое слово в некотором алфавите, а L(Y) — наибольший собственный префикс слова Y, являющийся его суффиксом. Тогда справедливы следующие утверждения:

  1. Слова L^2(Y), L^3(Y), \ldots являются собственными префиксами и суффиксами слова Y.
  2. Последовательность L(Y), L^2(Y), L^3(Y), \ldots обрывается на пустом слове.
  3. Любой префикс слова Y, являющийся его суффиксом, находится в последовательности L(Y), L^2(Y), L^3(Y), \ldots

Пример. Пусть Y = abbabbabbacabbab. Тогда

\eqa*{
L(Y) & = abbab,\\
L^2(Y) & = ab,\\
L^3 (Y) & = \lm.
}

Определение. Функцией откатов для слова Y = Y_1 Y_2 \ldots Y_n называют функцию f\colon \{1, 2\dts n\} \to \{0, 1, 2\dts n - 1\}, определяемую соотношением f(i) = |L({\rm pref}_i Y)|, где {\rm pref}_i
Yпрефикс длины i слова Y.

В нашем примере функция f(i) задается следующей таблицей:

i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
f(i) 0 0 0 1 2 3 4 5 6 7 0 1 2 3 4 5

Алгоритм Кнута-Морриса-Пратта построения функции откатов для слова Y = Y_1 Y_2 \ldots Y_n:

\formula{
f(1) := 0;\\
\t for\ i :=1\ \t to\ n - 1\ \t do\\
\mbox{}\q \t begin\ j := f(i);\\
\mbox{}\q\q \t while\ (Y[j + 1] \ne
Y[i + 1]) \& (j > 0)\
\t do\ j := f[j];\\
\mbox{}\q\q \t if\ Y[j + 1] = Y[i + 1]\
\t then\ f[i + 1] := j + 1\
\t else\ f[i +1] := 0;\\
\mbox{}\q\t end
}

Для разъяснения работы алгоритма рассмотрим ситуацию, возникшую при обработке слова Y на шаге i = 9. К этому моменту вычислены значения f(i) при i = 1, 2\dts 9:

i
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Y = a b b a b b a b b a c a b b a b
f(i) = 0 0 0 1 2 3 4 5 6

Выполняем j:= f[i] (f[i] = 6). Видим, что условие во внутреннем цикле не выполняется из-за первого сомножителя, так как Y[i + 1] = Y [j + 1], поэтому тело внутреннего цикла не выполняется, и далее в соответствии с алгоритмом вычисляем f[i + 1] := j + 1 (j + 1 = 7) и i := i + 1.

Пришли к следующей ситуации i = 10:

i
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Y = a b b a b b a b b a c a b b a b
f(i) = 0 0 0 1 2 3 4 5 6 7

Вычисляем j:= f [i] (f[i] = 7). Видим, что условие (Y[i + 1] \ne Y[j + 1] \& j > 0 ) во внутреннем цикле выполняется. Следовательно, вычисляется новое значение j := f[j] (= 4) ; условие опять выполнено, вычисляем новое j := f[j] = 1 и на этот раз условие выполняется, снова вычисляем j := f[j] (= 0). Наконец внутренний цикл завершается, причиной завершения является невыполнение условия (j > 0) и поэтому f[i + 1] :=
0. Итак, вычислено f[11] = 0.

Оценим трудоемкость алгоритма. Обработка очередной буквы Y[i + 1] может потребовать многих итераций во внутреннем цикле. Обозначим их число через N_i. Заметим, что каждая итерация внутреннего цикла уменьшает j по крайней мере на 1. С другой стороны, переход к следующему значению i увеличивает j не более чем на 1. Таким образом, имеем неравенства

\eq*{
f[i + 1] \le f[i] - N_i + 1
}

или

\eq*{
N_i \le f[i] - f[i + 1] + 1.
}

Суммируя последнее неравенство по i от 1 до n
- 1, получим

\eq*{
\suml_{i=1}^{n-1}N_{i}  = f[1]-f[n] + n - 1\le n.\vspace{-1mm}
}
Отсюда трудоемкость оценивается сверху величиной O(n).

Построение детерминированного конечного автомата по функции откатов. Задача заключается в том, чтобы построить конечный автомат, который, читая произвольный текст, приходил бы в финальное состояние, обнаружив фрагмент, совпадающий с заданным словом Y = Y_1 Y_2 \ldots Y_n.

Изложенный ниже алгоритм строит переходную функцию \varphi автомата

\eq*{
\Re = (Q, A, q_0, \{f\}, \varphi),
}
где Q = \{0, 1, 2\dts n\}, q_0 = 0, f =
n. Предполагаем, что функция откатов f уже построена.

\formula{
\t for\ j := 1\ \t to\ n\ \t do\
\varphi[j - 1, Y_j]:=j;\\
\t for\ a \in A,\ a \ne Y_1\
\t do\ \varphi[0, a]:= 0;\\
\t for\ j :=1\ \t to\ n\ \t do
for\ a \in A,\
a \ne Y_{j+1}\ \t do\ \varphi[j, a] :=
\varphi [f[j], a];
}

Для слова Y = aabbaab получим автомат, заданный диаграммой, изображенной на рис. 13.4.


Рис. 13.4.
Антон Сиротинкин
Антон Сиротинкин

на стр 6, лекции 3, Очевидно "Ck <= модуль(Gk(е))*b(k+1)" (1) - , подскажите что значит "модуль" и почему это очевидно...