Алгоритм Кока-Янгера-Касами разбора грамматики в НФХ — различия между версиями
Kabanov (обсуждение | вклад) м |
Kabanov (обсуждение | вклад) (→Псевдокод) |
||
Строка 26: | Строка 26: | ||
== Псевдокод == | == Псевдокод == | ||
+ | '''boolean''' CYK('''char'''[] w, '''list''' <tex>\Gamma</tex>, '''int''' S) | ||
+ | '''int''' n = length(w) | ||
+ | '''boolean''' d[<tex>|\Gamma|</tex>][n][n] | ||
+ | '''for''' i = 1 ... n | ||
+ | '''for''' (A <tex>\rightarrow</tex> w[i] <tex>\in</tex> <tex>\Gamma</tex>) | ||
+ | d[A,i,i] = true | ||
+ | '''for''' len = 1 .. n - 1 | ||
+ | '''for''' i = 1 .. n - len | ||
+ | '''for''' (A <tex>\rightarrow</tex> BC <tex>\in</tex> <tex>\Gamma</tex>) | ||
+ | '''for''' k = i .. i + len - 1 | ||
+ | d[A][i][i + len] = d[A][i][i + len] '''or''' d[B][i][k] '''and''' d[C][k + 1][i + len] | ||
+ | '''return''' d[S][1][n] | ||
== Асимптотика == | == Асимптотика == |
Версия 22:40, 4 ноября 2014
Задача: |
Пусть дана контекстно-свободная грамматика грамматика в нормальной форме Хомского и слово . Требуется выяснить, выводится ли это слово в данной грамматике. |
Алгоритм
Описание
Пусть
, если из нетерминала можно вывести подстроку . Иначе :.
Будем динамически заполнять матрицу
следующим алгоритмом (индукция по ):- База. . Ячейки заполняются значением , если правило принадлежит множеству правил грамматики : .
- Переход. Рассмотрим все пары . Значения для всех нетерминалов и пар уже вычислены, так что: .
- Завершение. После окончания работы ответ содержится в ячейке , где .
Псевдокод
boolean CYK(char[] w, list, int S) int n = length(w) boolean d[ ][n][n] for i = 1 ... n for (A w[i] ) d[A,i,i] = true for len = 1 .. n - 1 for i = 1 .. n - len for (A BC ) for k = i .. i + len - 1 d[A][i][i + len] = d[A][i][i + len] or d[B][i][k] and d[C][k + 1][i + len] return d[S][1][n]
Асимптотика
Необходимо вычислить
булевых величин. На каждую требуется затратить операций, где – количество правил. Суммируя по всем правилам получаем конечную сложность .Алгоритму требуется
памяти, где — количество нетерминалов грамматики.Пусть,
- длина входной строки, а - количество правил вывода в грамматике.Обработка правил вида
выполняется за .Проход по всем подстрокам выполняется за
. В обработке подстроки присутствует цикл по всем правилам вывода и по всем разбиениям на две подстроки, следовательно обработка работает за . В итоге - .Следовательно, общее время работы алгоритма -
. Кроме того, алгоритму требуется память (на массив ) объемом .Недостаток алгоритма заключается в том, что изначально грамматику необходимо привести к НФХ.