
- •1. Языки и грамматики. Обозначения, определения
- •1.1. Синтаксические деревья и неоднозначность
- •1.2. Классификация грамматик по Хомскому
- •1.3. Техника построения кс- и а- грамматик
- •1.4. Представление а - грамматики в виде графа состояний.
- •2. Распознаватели и автоматы
- •3. Автоматные грамматики и конечные автоматы
- •3.1. Эквивалентность недетерминированных и
- •3.2. Минимизация конечных автоматов
- •3.2.1. Проверка эквивалентности двух состояний.
- •3.2.2. Недостижимые состояния.
- •3.2.3. Метод разбиения
- •3.3. Линейное сжатие и ускорение автоматов
- •4. Эквивалентные преобразования кс- и а-грамматик
- •4.1. Декомпозиция правил грамматики
- •4.2. Исключение тупиков
- •4.3. Обобщенные кс-грамматики и приведение их к удлиняющей
- •4.4. Устранение левой рекурсии и левая факторизация
- •5. Свойства автоматных и контекстно-свободных
- •5.1. Общий вид цепочек а-языков
- •5.2. Общий вид цепочек кс-языков
- •5.3. Операции над языками
- •5.3.1. Операции над кс-языками
- •5.3.2. Операции над а-языками
- •5.4. Неоднозначность кс-грамматик и языков
3.3. Линейное сжатие и ускорение автоматов
Автомат называется линейно-огранниченным по памяти, если для обработки цепочки длины n он использует не более pn ячеек памяти.
Автомат называется линейно-ограниченным по времени, если для обработки цепочки длины n он требует не более cn шагов по времени.
Здесь p,c 1 - некоторые малые константы.
Справедлива следующая теорема о линейном сжатии.
Теорема 3.1. Если язык распознается (обрабатывается) автоматом с оценкой pn по памяти, то можно построить автомат, распознающий тот же язык с оценкой pn/k, где k - целое число (n k 1).
Доказательство. (Проведем его конструктивно, построением “сжатого” автомата для общего случая, когда автомат является преобразователем, то есть не только читает, но и пишет символы на ленту).
Пусть
- внешний алфавит,
- внутренний алфавит (множество состояний)
исходного автомата, а k - заданная
константа.
Построим новый внешний алфавит
,
состоящий из упорядоченных
последовательностей по k символов
старого алфавита и новое множество
состояний
,
где
Смысл здесь состоит в том, что k старых символов из A предполагается записывать в одну клетку входной ленты.
Построим правила переходов. Пусть эти правила в исходном автомате имели вид:
,
что означает: “читая с ленты символ
и
находясь в состоянии
,
автомат записывает на ленту символ
,
осуществляет сдвиг головки
,
где
может принимать значения
(влево),
(вправо) и
(остаться на месте), и переходит в
состояние
“.
При построении правил для нового автомата
надо учитывать тот факт, что новый
автомат обозревает сразу k букв
старого алфавита, но на самом деле
исходный автомат смотрел на
-тую
букву из этих k.
Правила перехода нового автомата будут иметь вид:
(а) если
то
где
если в исходном автомате был сдвиг
входной головки;
если в исходном автомате был сдвиг
;
если в исходном автомате был сдвиг
;
(б) если
и в исходном автомате был сдвиг
,
то
(в) если
и в исходном автомате был сдвиг
,
то
С практической точки зрения такое сжатие не дает других преимуществ, кроме сокращения записи на ленте, тогда как число состояний линейно возрастает в k раз, число входных символов растет экспоненциально и время обработки цепочки не изменяется. Тем не менее, рассмотренная теорема дает основание сформулировать теорему о линейном ускорении, которую мы изложим, применительно к рассматриваемым конечным автоматам.
Теорема 3.2. Для любого конечного автомата можно построить эквивалентный ему автомат, распознающий цепочки длины n за n/k шагов, где k - целое число (n k 1).
Доказательство. Сожмем исходный автомат в k раз и заменим каждые k шагов исходного автомата одним шагом в новом ускоренном автомате. Для этого, группы правил перехода исходного автомата, имеющие вид
заменим на правила
.
Пример 3.5. Пусть автомат распознает цепочки вида dobyto, doto, doby и никаких других. Каждая правильная цепочка завершается символом #. Таким образом внешний алфавит предложенного автомата A = {d,o,b,t,#}. и его можно определить, используя восемь состояний с таблицей переходов, представленной на рис 3.11 (а).
Ускорим этот автомат в два раза, а для этого сначала сожмем его вдвое и получим новый входной алфавит, содержащий пары символов
= {<do>,
<by>,
<to>,
<#
>, <dy>,
<db>,
...}.
Хотя таких пар будет всего 25, перечислять их все не имеет смысла. Правильные сочетания - это четыре первых пары приведенного множества. Встреча со всеми остальными всегда приводит к ошибке.
Новый автомат строим, заменяя пары правил перехода исходного автомата на одно правило результирующего. Например, правила dq0 q1
oq1 q2
заменяем на <do> Q0 Q2 ,
а правила bq2 q3
yq3 q4
на <by> Q2 Q4 .
В результате получим функциональную таблицу, приведенную на рис. 3.11 (б). Полученный автомат, обрабатывает входные цепочки за n/2 шагов.