Алгоритм Кока-Янгера-Касами разбора грамматики в НФХ — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
Строка 1: Строка 1:
Пусть дана [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|контекстно-свободная грамматика]] грамматика <tex>\Gamma</tex> и слово <tex>w \in \Sigma^{*}</tex>. Требуется выяснить, выводится ли это слово в данной грамматике.
+
{{Задача
 
+
|definition =
== Алгоритм для НФХ-грамматики ==
+
Пусть дана [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|контекстно-свободная грамматика]] грамматика <tex>\Gamma</tex> в [[нормальная форма Хомского|нормальной форме Хомского]] и слово <tex>w \in \Sigma^{*}</tex>. Требуется выяснить, выводится ли это слово в данной грамматике.
Пусть <tex>\Gamma</tex> приведена к [[нормальная форма Хомского|нормальной форме Хомского]].
+
}}
  
 +
== Алгоритм ==
 +
=== Описание ===
 
Пусть <tex>a_{A, i, j} = true</tex>, если из нетерминала <tex>A</tex> можно вывести подстроку <tex>w[i..j]</tex>. Иначе <tex>a_{A, i, j} = false</tex>:
 
Пусть <tex>a_{A, i, j} = true</tex>, если из нетерминала <tex>A</tex> можно вывести подстроку <tex>w[i..j]</tex>. Иначе <tex>a_{A, i, j} = false</tex>:
  
Строка 25: Строка 27:
 
*'''Завершение'''. После окончания работы ответ содержится в ячейке <tex>a_{S, 1, n}</tex>, где <tex>n = |w|</tex>.
 
*'''Завершение'''. После окончания работы ответ содержится в ячейке <tex>a_{S, 1, n}</tex>, где <tex>n = |w|</tex>.
  
== Сложность алгоритма ==
+
== Псевдокод ==
 +
 
 +
== Асимптотика ==
 
Необходимо вычислить <tex>n^2</tex> булевых величин. На каждую требуется затратить <tex>n \cdot |P_A|</tex> операций, где <tex>|P_A|</tex> – количество правил. Суммируя по всем правилам получаем конечную сложность <tex>O \left( n^3 \cdot |\Gamma| \right)</tex>.
 
Необходимо вычислить <tex>n^2</tex> булевых величин. На каждую требуется затратить <tex>n \cdot |P_A|</tex> операций, где <tex>|P_A|</tex> – количество правил. Суммируя по всем правилам получаем конечную сложность <tex>O \left( n^3 \cdot |\Gamma| \right)</tex>.
  
 
Алгоритму требуется <tex>n^2 \cdot |N|</tex> памяти, где <tex>|N|</tex> — количество нетерминалов грамматики.
 
Алгоритму требуется <tex>n^2 \cdot |N|</tex> памяти, где <tex>|N|</tex> — количество нетерминалов грамматики.
 +
***
 +
Пусть, <tex>n</tex> - длина входной строки, а <tex>m</tex> - количество правил вывода в грамматике.
 +
 +
Обработка правил вида <tex>A \rightarrow a_i</tex> выполняется за <tex>O(nm)</tex>.
 +
 +
Проход по всем подстрокам выполняется за <tex>O(n^2)</tex>. В обработке подстроки присутствует цикл по всем правилам вывода и по всем разбиениям на две подстроки, следовательно обработка работает за <tex>O(nm)</tex>. В итоге - <tex>O(n^3 m)</tex>.
 +
 +
Следовательно, общее время работы алгоритма - <tex>O(n^3 m)</tex>. Кроме того, алгоритму требуется память (на массив <tex>d</tex>) объемом <tex>O(n^2 m)</tex>.
  
 
Недостаток алгоритма заключается в том, что изначально грамматику необходимо привести к НФХ.
 
Недостаток алгоритма заключается в том, что изначально грамматику необходимо привести к НФХ.
 +
 +
== См. также ==
 +
==Источники информации==

Версия 21:40, 4 ноября 2014

Задача:
Пусть дана контекстно-свободная грамматика грамматика [math]\Gamma[/math] в нормальной форме Хомского и слово [math]w \in \Sigma^{*}[/math]. Требуется выяснить, выводится ли это слово в данной грамматике.


Алгоритм

Описание

Пусть [math]a_{A, i, j} = true[/math], если из нетерминала [math]A[/math] можно вывести подстроку [math]w[i..j][/math]. Иначе [math]a_{A, i, j} = false[/math]:

[math]a_{A, i, j} = \begin{cases} true,&\text{$A \Rightarrow^{*} w[i..j]$;}\\ false,&\text{else.} \end{cases} [/math].

Будем динамически заполнять матрицу [math]a_{A, i, j}[/math] следующим алгоритмом (индукция по [math]m = j - i[/math]):

  • База. [math]m = 0[/math]. Ячейки [math]a_{A, i, i}[/math] заполняются значением [math]true[/math], если правило [math]A \rightarrow w[i][/math] принадлежит множеству правил [math]P[/math] грамматики [math]\Gamma[/math]: [math]a_{A, i, i} = \lbrack A \rightarrow w[i] \in P \rbrack[/math].
  • Переход. Рассмотрим все пары [math]\lbrace \langle j, i \rangle | j-i=m \rbrace[/math]. Значения для всех нетерминалов и пар [math]\lbrace \langle j', i' \rangle | j-i\lt m \rbrace[/math] уже вычислены, так что: [math]a_{A, i, j} = \bigvee\limits_{k=i}^{j-1} \bigvee\limits_{A \rightarrow BC} \left( a_{B, i, k} \wedge a_{C, k+1, j} \right)[/math].

CYK rule 2.jpg

  • Завершение. После окончания работы ответ содержится в ячейке [math]a_{S, 1, n}[/math], где [math]n = |w|[/math].

Псевдокод

Асимптотика

Необходимо вычислить [math]n^2[/math] булевых величин. На каждую требуется затратить [math]n \cdot |P_A|[/math] операций, где [math]|P_A|[/math] – количество правил. Суммируя по всем правилам получаем конечную сложность [math]O \left( n^3 \cdot |\Gamma| \right)[/math].

Алгоритму требуется [math]n^2 \cdot |N|[/math] памяти, где [math]|N|[/math] — количество нетерминалов грамматики.

Пусть, [math]n[/math] - длина входной строки, а [math]m[/math] - количество правил вывода в грамматике.

Обработка правил вида [math]A \rightarrow a_i[/math] выполняется за [math]O(nm)[/math].

Проход по всем подстрокам выполняется за [math]O(n^2)[/math]. В обработке подстроки присутствует цикл по всем правилам вывода и по всем разбиениям на две подстроки, следовательно обработка работает за [math]O(nm)[/math]. В итоге - [math]O(n^3 m)[/math].

Следовательно, общее время работы алгоритма - [math]O(n^3 m)[/math]. Кроме того, алгоритму требуется память (на массив [math]d[/math]) объемом [math]O(n^2 m)[/math].

Недостаток алгоритма заключается в том, что изначально грамматику необходимо привести к НФХ.

См. также

Источники информации