Алгоритм Эрли, доказательство оценки O(n^2) для однозначной грамматики — различия между версиями
Zernov (обсуждение | вклад) (→Время работы для однозначной грамматики) |
Zernov (обсуждение | вклад) (→Алгоритм) |
||
Строка 4: | Строка 4: | ||
Будем рассматривать грамматику [[Удаление eps-правил из грамматики|без ε-правил]] и [[Удаление бесполезных символов из грамматики|бесполезных символов]]. | Будем рассматривать грамматику [[Удаление eps-правил из грамматики|без ε-правил]] и [[Удаление бесполезных символов из грамматики|бесполезных символов]]. | ||
− | <tex> | + | '''function''' <tex>\mathtt{earley_mod}(G, w)</tex>: |
− | + | <font color=green>// Инициализация </font> | |
− | + | <tex> D_{0} = \lbrace [S' \rightarrow \cdot S, 0] \rbrace </tex> | |
− | + | useful_loop(0) | |
− | + | '''for''' j = 1 .. n | |
− | + | '''for''' <tex>[A \rightarrow \alpha \cdot a_{j} \beta, i] \in D_{j-1}</tex> | |
− | + | <tex>D_j</tex> <tex> \cup</tex> = <tex>[A \rightarrow \alpha a_{j} \cdot \beta, i]</tex> <font color=green>// Первое правило </font> | |
+ | useful_loop(j) | ||
− | function useful_loop(j): | + | '''function''' useful_loop(j): |
− | <tex> | + | <tex>D_j'' = D_j</tex> |
− | while <tex> | + | '''while''' <tex>D_j'' \ne \varnothing</tex> |
− | <tex> | + | <tex>D_j' = D_j''</tex> |
− | <tex> | + | <tex>D_j'' = \varnothing</tex> |
− | for <tex>[B \rightarrow \eta \cdot , i] \in | + | '''for''' <tex>[B \rightarrow \eta \cdot , i] \in D_j'</tex> <font color=green>// Цикл (*) </font> |
− | for <tex>[A \rightarrow \alpha \cdot B \beta, k] \in | + | '''for''' <tex>[A \rightarrow \alpha \cdot B \beta, k] \in D_{i}</tex> |
− | <tex> | + | <tex>D_j''</tex> <tex> \cup</tex> = <tex>[A \rightarrow \alpha B \cdot \beta, k] </tex> <font color=green>// Второе правило </font> |
− | for <tex>[B \rightarrow \alpha \cdot A \eta, k] \in | + | '''for''' <tex>[B \rightarrow \alpha \cdot A \eta, k] \in D_j'</tex> <font color=green>// Цикл (**) </font> |
− | for <tex>\beta : (A \rightarrow \beta) \in P</tex> | + | '''for''' <tex>\beta : (A \rightarrow \beta) \in P</tex> |
− | <tex> | + | <tex>D_j''</tex> <tex> \cup</tex> = <tex>[A \rightarrow \cdot \beta, j]</tex> <font color=green>// Третье правило </font> |
− | <tex> | + | <tex>D_j</tex> <tex> \cup</tex> = <tex>D_j''</tex> |
== Доказательство эквивалентности == | == Доказательство эквивалентности == |
Версия 23:32, 4 января 2017
Содержание
Алгоритм
Для начала модифицируем алгоритм Эрли.
Будем рассматривать грамматику без ε-правил и бесполезных символов.
function: // Инициализация useful_loop(0) for j = 1 .. n for = // Первое правило useful_loop(j)
function useful_loop(j):while for // Цикл (*) for = // Второе правило for // Цикл (**) for = // Третье правило =
Доказательство эквивалентности
В циклах, помеченных while
. Данная модификация является корректной.
- Рассмотрим цикл . Если в текущей ситуации этого цикла , то во внутреннем цикле просматривается список с меньшим индексом, в который новые ситуации больше не добавляются. Поэтому после первого просмотра этого списка будут добавлены все ситуации, удовлетворяющие условию, и больше ситуацию в цикле рассматривать не нужно. Если же , то , что возможно, только если . Тогда во внутреннем цикле не будет добавлено ни одной ситуации, так как не встречается в правых частях правил.
- Теперь рассмотрим цикл . Так как для каждой ситуации в список добавляется новая ситуация, соответствующая правилу из грамматики, а грамматика фиксирована, то после первого просмотра будут добавлены все возможные ситуации для .
Таким образом, во все списки будут добавлены ситуации, которые были бы добавлены в ходе обычного алгоритма. Очевидно, что лишних ситуаций добавлено не будет, так как в циклах
и просматривается подмножество полного списка. Значит этот алгоритм эквивалентен оригинальному.Время работы для однозначной грамматики
Лемма (1): |
в списке находится ситуаций. |
Доказательство: |
Так как грамматика фиксирована, то | количество ситуаций вида не больше некоторой константы. Таким образом, поскольку в находятся ситуации, у которых , всего в будет ситуаций.
Лемма (2): |
Пусть — однозначная КС-грамматика без непорождающих нетерминалов и — цепочка из . Тогда алгоритм Эрли пытается включить в не более одного раза, если . |
Доказательство: |
Ситуацию можно включить в только по правилам (если последний символ — терминал) и (если нетерминал). В первом случае результат очевиден. Во втором случае допустим, что включается в , когда рассматриваются две ситуации и (они различны, так как в цикле каждая ситуация из каждого списка рассматривается по одному разу). Тогда ситуация должна оказаться одновременно в и в . Таким образом, получаем:
Следовательно, |
Теорема: |
Если входная грамматика однозначна, то время выполнения алгоритма Эрли для слова длины составляет . |
Доказательство: |
Орагнизуем каждый список разбора таким образом, чтобы по любому символу , можно было за получить список тех и только тех ситуаций, содержащихся в , которые имеют вид .Время построения не зависит от входной строки.Рассмотрим .
|
См. также
Источники информации
- А. Ахо, Дж. Ульман. Теория синтакcического анализа, перевода и компиляции. Том 1. Синтакcический анализ.