Алгоритм Кока-Янгера-Касами, модификация для произвольной грамматики
| НЕТ ВОЙНЕ |
|
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян. Будучи гражданами Российской Федерации, мы против своей воли оказались ответственными за нарушение международного права, военное вторжение и массовую гибель людей. Чудовищность совершенного преступления не оставляет возможности промолчать или ограничиться пассивным несогласием. Мы убеждены в абсолютной ценности человеческой жизни, в незыблемости прав и свобод личности. Режим Путина — угроза этим ценностям. Наша задача — обьединить все силы для сопротивления ей. Эту войну начали не россияне, а обезумевший диктатор. И наш гражданский долг — сделать всё, чтобы её остановить. Антивоенный комитет России |
| Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению. |
| meduza.io, Популярная политика, Новая газета, zona.media, Майкл Наки. |
| Задача: |
| Пусть дана контекстно-свободная грамматика и слово . Требуется выяснить, выводится ли это слово в данной грамматике. |
Базовая версия данного алгоритма работает только для грамматик в нормальной форме Хомского. Модифицируем алгоритм для работы на произвольных контекстно-свободных грамматиках. Модификация алгоритма сильно проще в написании, чем приведение к нормальной форме Хомского, поэтому часто используют её, не смотря на то, что время работы у нее больше.
Алгоритм для произвольной грамматики
Будем решать задачу динамическим программированием. Введём динамику , аналогично базовой версии алгоритма.
Также введём вспомогательный четырехмерный массив тогда и только тогда, когда из префикса длины правой части данного правила можно вывести .
Рассмотрим все тройки , где — константа и , и такое, что .
- База динамики:
- , если в грамматике присутствует правило , иначе ;
- , если в грамматике присутствует правило , иначе ;
- .
- Переход:
- Пусть значения для всех нетерминалов, пар и уже вычислены, поэтому вспомогательная динамика: То есть, подстроку можно вывести из префикса длины правой части данного правила, если из префикса длины правой части данного правила можно вывести , а подстрока выводится из -го символа правой части правила. Это вычисление может обратится к , но на результат это не повлияет, так как в данный момент .
- Но если — терминал, то подстроку можно вывести из префикса длины правой части данного правила, если из префикса длины правой части данного правила можно вывести , а подстрока выводится, если .
- Базовая динамика выражается так: . То есть, подстроку можно вывести из нетерминала , если из длины правой части данного правила можно вывести .
- Завершение:
- После окончания работы ответ содержится в ячейке , где .
Псевдокод
CYK_Modified(S, Г): // S — строка длины n, Г — КС-грамматика
for i = 1..n
for Rj -> alpha // перебор состояний
if( A -> w[i] in Г) a[A, i, i+1] = true // если в грамматике Г присутствует правило A -> w[i]
else a[A, i, i+1] = false
if( A -> eps in Г) a[A, i, i] = true // если в грамматике Г присутствует правило A -> eps
else a[A, i, i] = false
h[A->alpha, i, i, 0] = true
for m = 1..n
for i = 1..n
j = i+m
for k = 1..M
for Rj -> alpha // перебор состояний
h[A->alpha, i, j+1, k] = OR( for r = i..j+1) (h[A->alpha, i, r, k-1] & a[alpha[k],r,j+1])
for i = 1..n
for j = 1..n
for Rj -> alpha
a[A, i, j] = OR( for A->alpha) h[A->alpha, i, j, |alpha|] // где |alpha| — размер правой части правила
return a[S, 1, n]
Оценка сложности
Обозначим — максимальную длину правой части правила.
Обработки правил вида , и нахождение выполняются за .
Время одного перехода вспомогательной динамики , суммарное число состояний . Отсюда расчёт вспомогательной динамики занимает времени, базовая динамика находится, как . Итоговая временная сложность алгоритма равна . Алгоритму требуется памяти.