Алгоритм Эрли, доказательство оценки O(n^2) для однозначной грамматики — различия между версиями
Kirelagin (обсуждение | вклад) |
Kirelagin (обсуждение | вклад) (→Время работы для однозначной грамматики) |
||
| Строка 59: | Строка 59: | ||
Если входная грамматика однозначна, то время выполнения алгоритма Эрли для слова длины <tex>n</tex> составляет <tex>O(n^2)</tex>. | Если входная грамматика однозначна, то время выполнения алгоритма Эрли для слова длины <tex>n</tex> составляет <tex>O(n^2)</tex>. | ||
|proof= | |proof= | ||
| − | + | По лемме 1 в <tex>j</tex>-том списке в итоге будет содержаться <tex>O(j)</tex> ситуаций, а по лемме 2 алгоритм попытается добавить в список принадлежащую ему ситуацию ровно один раз, т.е. соответствующие строчки кода выполнятся для <tex>j</tex>-того списка суммарно <tex>O(j)</tex> раз. | |
| − | + | Заметим, чтобы избежать «холостых» итераций во внутреннем цикле правила <tex>(2)</tex>, необходимо организовать списки <tex>I_k</tex> таким образом, чтобы по любому символу <tex>x \in (\Sigma \cup N)</tex>, можно было за <tex>O(1)</tex> получить список тех и только тех ситуаций, содержащихся в <tex>I_k</tex>, которые имеют вид <tex>[A \rightarrow \alpha \cdot x \beta, j]</tex> (например, этого можно добиться с помощью [[Хеширование#Хеш-таблица|хеш-таблицы]]). | |
| − | + | Таким образом, поскольку списков ситуаций всего <tex>n</tex>, время работы алгоритма составляет <tex>O(n^2)</tex>. | |
| − | |||
| − | |||
| − | |||
| − | |||
}} | }} | ||
==Литература== | ==Литература== | ||
*А. Ахо, Дж. Ульман. Теория синтакcического анализа, перевода и компиляции. Том 1. Синтакcический анализ. | *А. Ахо, Дж. Ульман. Теория синтакcического анализа, перевода и компиляции. Том 1. Синтакcический анализ. | ||
Версия 01:51, 24 января 2012
Алгоритм
Для начала модифицируем алгоритм Эрли.
Будем рассматривать грамматику без ε-правил и бесполезных символов.
= # Правило (0) — инициализация useful_loop(0) for j = 1..n for ∪= # Правило (1) useful_loop(j)
function useful_loop(j):
while
for # (*)
for
∪= # Правило (2)
for # (**)
for
∪= # Правило (3)
∪=
В циклах, помеченных и , просматривается не весь список , а только те ситуации, которые были добавлены на предыдущей итерации цикла while. Данная модификация является корректной.
- Рассмотрим цикл . Если в текущей ситуации этого цикла , то во внутреннем цикле просматривается список с меньшим индексом, в который новые ситуации больше не добавляются. Поэтому после первого просмотра этого списка будут добавлены все ситуации, удовлетворяющие условию, и больше ситуацию в цикле рассматривать не нужно. Если же , то , что возможно, только если . Тогда во внутреннем цикле не будет добавлено ни одной ситуации, так как не встречается в правых частях правил.
- Теперь рассмотрим цикл . Так как для каждой ситуации в список добавляется новая ситуация, соответствующая правилу из грамматики, а грамматика фиксирована, то после первого просмотра будут добавлены все возможные ситуации для .
Таким образом, во все списки будут добавлены ситуации, которые были бы добавлены в ходе обычного алгоритма. Очевидно, что лишних ситуаций добавлено не будет, так как в циклах и просматривается подмножество полного списка. Значит этот алгоритм эквивалентен оригинальному.
Время работы для однозначной грамматики
| Лемма (1): |
в списке находится ситуаций. |
| Доказательство: |
| Так как грамматика фиксирована, то количество ситуаций вида не больше некоторой константы. Таким образом, поскольку в находятся ситуации, у которых , всего в будет ситуаций. |
| Лемма (2): |
Пусть — однозначная КС-грамматика без непорождающих нетерминалов и — цепочка из . Тогда алгоритм Эрли пытается включить в не более одного раза, если . |
| Доказательство: |
|
Ситуацию можно включить в только по правилам (если последний символ — терминал) и (если нетерминал). В первом случае результат очевиден. Во втором случае допустим, что включается в , когда рассматриваются две ситуации и (они различны, так как в цикле каждая ситуация из каждого списка рассматривается по одному разу). Тогда ситуация должна оказаться одновременно в и в . Таким образом, получаем:
Следовательно, и . |
| Теорема: |
Если входная грамматика однозначна, то время выполнения алгоритма Эрли для слова длины составляет . |
| Доказательство: |
|
По лемме 1 в -том списке в итоге будет содержаться ситуаций, а по лемме 2 алгоритм попытается добавить в список принадлежащую ему ситуацию ровно один раз, т.е. соответствующие строчки кода выполнятся для -того списка суммарно раз. Заметим, чтобы избежать «холостых» итераций во внутреннем цикле правила , необходимо организовать списки таким образом, чтобы по любому символу , можно было за получить список тех и только тех ситуаций, содержащихся в , которые имеют вид (например, этого можно добиться с помощью хеш-таблицы). Таким образом, поскольку списков ситуаций всего , время работы алгоритма составляет . |
Литература
- А. Ахо, Дж. Ульман. Теория синтакcического анализа, перевода и компиляции. Том 1. Синтакcический анализ.