Алгоритм Кока-Янгера-Касами разбора грамматики в НФХ — различия между версиями
Kirelagin (обсуждение | вклад) |
Kirelagin (обсуждение | вклад) |
||
Строка 13: | Строка 13: | ||
</tex>. | </tex>. | ||
− | Будем динамически заполнять матрицу <tex>a_{A, i, j}</tex> следующим алгоритмом (индукция по <tex>m</tex>): | + | Будем динамически заполнять матрицу <tex>a_{A, i, j}</tex> следующим алгоритмом (индукция по <tex>m = j - i</tex>): |
− | *'''База'''. Ячейки <tex>a_{A, i, i}</tex> заполняются | + | *'''База'''. <tex>m = 0</tex>. Ячейки <tex>a_{A, i, i}</tex> заполняются значением <tex>true</tex>, если правило <tex>A \rightarrow w[i]</tex> принадлежит множеству правил <tex>P</tex> грамматики <tex>\Gamma</tex>: <tex>a_{A, i, i} = \lbrack A \rightarrow w[i] \in P \rbrack</tex>. |
− | <tex>a_{A, i, i} = \lbrack A \rightarrow w[i] \in P \rbrack</tex>. | ||
− | *'''Переход'''. | + | *'''Переход'''. Рассмотрим все пары <tex>\lbrace \langle j, i \rangle | j-i=m \rbrace</tex>. Значения для всех нетерминалов и пар <tex>\lbrace \langle j', i' \rangle | j-i<m \rbrace</tex> уже вычислены, так что: <tex>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)</tex>. |
− | <tex>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)</tex>. | ||
[[Файл:CYK_rule_2.jpg]] | [[Файл:CYK_rule_2.jpg]] | ||
Строка 28: | Строка 26: | ||
Необходимо вычислить <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> — количество нетерминалов грамматики. |
− | + | Недостаток алгоритма заключается в том, что изначально грамматику необходимо привести к НФХ. |
Версия 07:51, 4 декабря 2011
Пусть дана контекстно-свободная грамматика грамматика и слово . Требуется выяснить, выводится ли это слово в данной грамматике.
Алгоритм для НФХ-грамматики
Пусть нормальной форме Хомского.
приведена кПусть
, если из нетерминала можно вывести подстроку . Иначе :.
Будем динамически заполнять матрицу
следующим алгоритмом (индукция по ):- База. . Ячейки заполняются значением , если правило принадлежит множеству правил грамматики : .
- Переход. Рассмотрим все пары . Значения для всех нетерминалов и пар уже вычислены, так что: .
- Завершение. После окончания работы ответ содержится в ячейке , где .
Сложность алгоритма
Необходимо вычислить
булевых величин. На каждую требуется затратить операций, где – количество правил. Суммируя по всем правилам получаем конечную сложность .Алгоритму требуется
памяти, где — количество нетерминалов грамматики.Недостаток алгоритма заключается в том, что изначально грамматику необходимо привести к НФХ.