Алгоритм Эрли, доказательство оценки O(n^2) для однозначной грамматики — различия между версиями
AndrewD (обсуждение | вклад) |
AndrewD (обсуждение | вклад) |
||
Строка 65: | Строка 65: | ||
Рассмотрим <tex>I_j, \, j > 0</tex>. | Рассмотрим <tex>I_j, \, j > 0</tex>. | ||
# При включении ситуаций по правилу <tex>(1)</tex> необходимо лишь просмотреть предыдущий список и для каждого его элемента выполнить константное число операций. | # При включении ситуаций по правилу <tex>(1)</tex> необходимо лишь просмотреть предыдущий список и для каждого его элемента выполнить константное число операций. | ||
− | # Из леммы 2 следует, что любая ситуация, рассматриваемая в правиле <tex>(2)</tex>, должна быть добавлена (так как она удовлетворяет условию и ее еще нет в списке). Кроме того, так как по нетерминалу можно за <tex>O(1)</tex> получить список ситуаций, удовлетворяющих условию, то все итерации внутри цикла <tex>(*)</tex> будут приводить к добавлению в список новых ситуаций. | + | # Из леммы 2 следует, что любая ситуация, рассматриваемая в правиле <tex>(2)</tex>, должна быть добавлена (так как она удовлетворяет условию и ее еще нет в списке). Кроме того, так как по нетерминалу можно за <tex>O(1)</tex> получить список ситуаций, удовлетворяющих условию, то все итерации внутри цикла <tex>(*)</tex> будут приводить к добавлению в список новых ситуаций. Тогда, так как по лемме 1 в списке <tex>I_j</tex> <tex>O(j)</tex> ситуаций, то суммарно за все итерации внешнего цикла while правило <tex>(2)</tex> будет применено <tex>O(j)</tex> раз. |
# Так как грамматика фиксирована, то при применении правила <tex>(3)</tex> при рассмотрении любой ситуации количество включаемых ситуаций не превосходит некоторой константы, поэтому для каждой рассмотренной ситуации будет выполнено <tex>O(1)</tex> операций. | # Так как грамматика фиксирована, то при применении правила <tex>(3)</tex> при рассмотрении любой ситуации количество включаемых ситуаций не превосходит некоторой константы, поэтому для каждой рассмотренной ситуации будет выполнено <tex>O(1)</tex> операций. | ||
− | Таким образом, на | + | Таким образом, на построение списка <tex>I_j</tex> будет потрачено <tex>O(j)</tex> операций. Тогда время работы алгоритма составляет <tex>O(n^2)</tex>. |
}} | }} | ||
==Литература== | ==Литература== | ||
*А. Ахо, Дж. Ульман. Теория синтакcического анализа, перевода и компиляции. Том 1. Синтакcический анализ. | *А. Ахо, Дж. Ульман. Теория синтакcического анализа, перевода и компиляции. Том 1. Синтакcический анализ. |
Версия 08:29, 23 января 2012
Алгоритм
Для начала модифицируем алгоритм Эрли.
Будем рассматривать грамматику без ε-правил и бесполезных символов.
= # Правило (0) — инициализация useful_loop(0) for i = 1..n for ∪= # Правило (1) useful_loop(j)
function useful_loop(j):while for # (*) for ∪= # Правило (2) for # (**) for ∪= # Правило (3) ∪=
В циклах, помеченных while
. Данная модификация является корректной.
- Рассмотрим цикл . Если в текущей ситуации этого цикла , то во внутреннем цикле просматривается список с меньшим индексом, в который новые ситуации больше не добавляются. Поэтому после первого просмотра этого списка будут добавлены все ситуации, удовлетворяющие условию, и больше ситуацию в цикле рассматривать не нужно. Если же , то , что возможно, только если . Тогда во внутреннем цикле не будет добавлено ни одной ситуации, так как не встречается в правых частях правил.
- Теперь рассмотрим цикл . Так как для каждой ситуации в список добавляется новая ситуация, соответствующая правилу из грамматики, а грамматика фиксирована, то после первого просмотра будут добавлены все возможные ситуации для .
Таким образом, во все списки будут добавлены ситуации, которые были бы добавлены в ходе обычного алгоритма. Очевидно, что лишних ситуаций добавлено не будет, так как в циклах
и просматривается подмножество полного списка. Значит этот алгоритм эквивалентен оригинальному.Время работы для однозначной грамматики
Лемма (1): |
в списке находится ситуаций. |
Доказательство: |
Так как грамматика фиксирована, то | количество ситуаций вида не больше некоторой константы. Таким образом, поскольку в находятся ситуации, у которых , всего в будет ситуаций.
Лемма (2): |
Пусть — однозначная КС-грамматика без непорождающих нетерминалов и — цепочка из . Тогда алгоритм Эрли пытается включить в не более одного раза, если . |
Доказательство: |
Ситуацию можно включить в только по правилам (если последний символ — терминал) и (если нетерминал). В первом случае результат очевиден. Во втором случае допустим, что включается в , когда рассматриваются две ситуации и (они различны, так как в цикле каждая ситуация из каждого списка рассматривается по одному разу). Тогда ситуация должна оказаться одновременно в и в . Таким образом, получаем:
Следовательно, |
Теорема: |
Если входная грамматика однозначна, то время выполнения алгоритма Эрли для слова длины составляет . |
Доказательство: |
Орагнизуем каждый список разбора таким образом, чтобы по любому символу , можно было за получить список тех и только тех ситуаций, содержащихся в , которые имеют вид .Время построения не зависит от входной строки.Рассмотрим .
|
Литература
- А. Ахо, Дж. Ульман. Теория синтакcического анализа, перевода и компиляции. Том 1. Синтакcический анализ.