Алгоритм Эрли, доказательство оценки O(n^2) для однозначной грамматики — различия между версиями
AndrewD (обсуждение | вклад) |
AndrewD (обсуждение | вклад) |
||
Строка 30: | Строка 30: | ||
<tex>\forall\,j: 1 \le j \le n</tex> в списке <tex>I_j</tex> находится <tex>O(j)</tex> ситуаций. | <tex>\forall\,j: 1 \le j \le n</tex> в списке <tex>I_j</tex> находится <tex>O(j)</tex> ситуаций. | ||
|proof= | |proof= | ||
− | Так как грамматика фиксирована, то <tex>\forall i</tex> количество ситуаций вида <tex>[A \rightarrow \alpha \cdot \beta, i]</tex> не больше | + | Так как грамматика фиксирована, то <tex>\forall i</tex> количество ситуаций вида <tex>[A \rightarrow \alpha \cdot \beta, i]</tex> не больше некоторой константы. Таким образом, так как в <tex>I_j</tex> находятся ситуации, у которых <tex>0 \le i \le j</tex>, то всего в <tex>I_j</tex> будет <tex>O(j)</tex> ситуаций. |
}} | }} | ||
Строка 49: | Строка 49: | ||
Орагнизуем каждый список разбора <tex>I_j</tex> таким образом, чтобы по любому символу <tex>x \in \Sigma \cup N</tex>, можно было за <tex>O(1)</tex> получить список тех и только тех ситуаций, содержащихся в <tex>I_j</tex>, которые имеют вид <tex>[A \rightarrow \alpha \cdot x \beta, j]</tex>. | Орагнизуем каждый список разбора <tex>I_j</tex> таким образом, чтобы по любому символу <tex>x \in \Sigma \cup N</tex>, можно было за <tex>O(1)</tex> получить список тех и только тех ситуаций, содержащихся в <tex>I_j</tex>, которые имеют вид <tex>[A \rightarrow \alpha \cdot x \beta, j]</tex>. | ||
− | + | При построении <tex>I_0</tex> входная строка не учитывается, поэтому этот список можно построить за константное время. | |
− | |||
− | |||
Рассмотрим <tex>I_j, \, j > 0</tex>. Рассмотрим шаги <tex>(4)</tex>, <tex>(5)</tex> и <tex>(6)</tex>. | Рассмотрим <tex>I_j, \, j > 0</tex>. Рассмотрим шаги <tex>(4)</tex>, <tex>(5)</tex> и <tex>(6)</tex>. | ||
− | # На шаге <tex>(4)</tex> исследуется <tex>a_j</tex> и предыдущий список. Для каждой ситуации из <tex>I_{j-1}</tex> с символом <tex>a_j</tex>, расположенным справа от точки, в <tex>I_j</tex> включается некоторая ситуация. Так как список в <tex>I_{j-1}</tex> можно найти за <tex>O(1)</tex> по символу <tex>a_j</tex>, то на включение каждой ситуации в <tex>I_j</tex> будет потрачено | + | # На шаге <tex>(4)</tex> исследуется <tex>a_j</tex> и предыдущий список. Для каждой ситуации из <tex>I_{j-1}</tex> с символом <tex>a_j</tex>, расположенным справа от точки, в <tex>I_j</tex> включается некоторая ситуация. Так как список в <tex>I_{j-1}</tex> можно найти за <tex>O(1)</tex> по символу <tex>a_j</tex>, то на включение каждой ситуации в <tex>I_j</tex> будет потрачено <tex>O(1)</tex> операций. |
#Если применяется шаг <tex>(5)</tex>, то в некотором списке <tex>I_k</tex> для <tex>k \le j</tex> надо просмотреть все ситуации, содержащие <tex>"\cdot B"</tex> для некоторого конкретного <tex>B</tex>. Для каждой такой ситуации в <tex>I_j</tex> включается другая ситуация, и это время относится не к рассматриваемой ситуации, а к включаемой. Кроме того, так как по второй лемме для каждой ситуации предпринимается только одна попытка включить ее в список, то не нужно тратить время на проверку того, что включаемая ситуация уже есть в списке. | #Если применяется шаг <tex>(5)</tex>, то в некотором списке <tex>I_k</tex> для <tex>k \le j</tex> надо просмотреть все ситуации, содержащие <tex>"\cdot B"</tex> для некоторого конкретного <tex>B</tex>. Для каждой такой ситуации в <tex>I_j</tex> включается другая ситуация, и это время относится не к рассматриваемой ситуации, а к включаемой. Кроме того, так как по второй лемме для каждой ситуации предпринимается только одна попытка включить ее в список, то не нужно тратить время на проверку того, что включаемая ситуация уже есть в списке. | ||
− | #Так как | + | #Так как грамматика фиксирована, то на шаге <tex>(6)</tex> при рассмотрении любой ситуации количество включаемых ситуаций не превосходит некоторой константы, поэтому на рассматриваемую ситуацию будет потрачено <tex>O(1)</tex> операций. |
− | Таким образом, время работы алгоритма составляет <tex>O(n^2)</tex>. | + | Таким образом, на каждую ситуацию тратится <tex>O(1)</tex> операций. Тогда, учитывая лемму 1, получаем, что время работы алгоритма составляет <tex>O(n^2)</tex>. |
}} | }} | ||
==Литература== | ==Литература== | ||
*А. Ахо, Дж. Ульман. Теория синтакcического анализа, перевода и компиляции. Том 1. Синтакcический анализ. | *А. Ахо, Дж. Ульман. Теория синтакcического анализа, перевода и компиляции. Том 1. Синтакcический анализ. |
Версия 05:25, 18 января 2012
Алгоритм
Приведем Алгоритм Эрли.
На вход подается КС-грамматика и строка из . Результатом работы алгоритма является список разбора для строки .
Построение
:Шаг 1. Для каждого правила
из , включить в .Выполнять шаги
и до тех пор, пока в можно включать новые ситуации.Шаг 2. Если
, то для всех включить в ситуацию .Шаг 3. Если
, то для всех правил из вида включить в ситуацию .После того, как построены
, строится :Шаг 4. Для каждой ситуации
включить в ситуацию .Выполнять шаги
и до тех пор, пока в можно включать новые ситуации.Шаг 5. Если
, то для всех ситуаций включить в .Шаг 6. Если
, то для всех правил из включить в .Время работы для однозначной грамматики
Лемма (1): |
в списке находится ситуаций. |
Доказательство: |
Так как грамматика фиксирована, то | количество ситуаций вида не больше некоторой константы. Таким образом, так как в находятся ситуации, у которых , то всего в будет ситуаций.
Лемма (2): |
Пусть — однозначная КС-грамматика и — цепочка из . Тогда алгоритм Эрли пытается включить в не более одного раза, если . |
Доказательство: |
Ситуацию можно включить в только на шагах , , или . Если она включается на шаге , то последний символ цепочки — терминал, а если на шагах или , то — нетерминал. В первом случае результат очевиден. Во втором случае допустим, что включается в , когда рассматриваются две различные ситуации и . Тогда ситуация должна оказаться одновременно в и в .
|
Теорема: |
Если входная грамматика однозначна, то время выполнения алгоритма Эрли для слова длины составляет . |
Доказательство: |
Орагнизуем каждый список разбора таким образом, чтобы по любому символу , можно было за получить список тех и только тех ситуаций, содержащихся в , которые имеют вид .При построении входная строка не учитывается, поэтому этот список можно построить за константное время.Рассмотрим . Рассмотрим шаги , и .
|
Литература
- А. Ахо, Дж. Ульман. Теория синтакcического анализа, перевода и компиляции. Том 1. Синтакcический анализ.