Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
3_Кінцеві автомати_РВ-НКА-ДКА.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
411 Кб
Скачать
☆

3.4 Двустекове моделювання нка

Тепер розглянемо алгоритм, що по НКА N, побудованому за алгоритмом 3.3, і вхідному рядку х визначає, чи допускається х автоматом N. Алгоритм зчитує рядок посимвольно й обчислює повну множину станів, у яких N може перебувати після прочитання кожного вхідного префікса. Для ефективної побудови множини недетермінованих станів алгоритм використає властивості НКА, одержувані при побудові останнього за алгоритмом 3.3. Алгоритм може бути виконаний за час, пропорційний |N| x|х|, де |N| — кількість станів N, a |х| — довжина рядка х.

Алгоритм 3.4. Моделювання НКА

Вхід. НКА N, побудований за алгоритмом 3.3, і вхідний рядок. Будемо вважати, що рядок х закінчується символом кінця файлу eof. Стартовий стан НКА — s0, a множина заключних станів — F.

Вихід. Відповідь "так", якщо N допускає х, і "ні" у противному випадку.

Метод. Застосуємо алгоритм, схематично зображений на рис. 3.13, до вхідного рядка х. Алгоритм, по суті, виконує побудову підмножини. Він обчислює перехід з поточної множини станів S у наступну множину станів у два етапи. Спочатку визначається move(S,а), всі стани, які можуть бути досягнуті із ­ стану S переходом по а (поточному вхідному символу). Потім обчислюється ε-замикання цієї множини, тобто всі стани, які можуть бути досягнуті з move(S,а) декількома ε-переходами (включаючи нуль ε-переходів). Для зчитування чергового символу із вхідного рядка використається функція nextchar. Коли зчитані всі символи, алгоритм перевіряє наявність заключного стану в множині поточних станів S і відповідає "так", якщо воно там є, і "ні" у противному випадку.

S := ε-closure({s0});

а := nextchar;

while a ≠ eof do begin

S := ε-closure(move(S,a);

a := nextchar

end;

if S ∩ F ≠ Ø then

return"так"

else return "ні"

Рис. 3.14. Моделювання НКА, побудованого за алгоритмом 3.3

Алгоритм 3.4 може бути ефективно реалізований з використанням двох стеків і бітового вектора, індексованого станами НКА. Один стек використається для відстеження поточної множини недетермінованих станів, а другий— для обчислення множини станів після переходу. Для обчислення ε-closure застосовується алгоритм, наведений на рис. 3.8. Бітовий вектор може використатися для визначення, чи є деякий недетермінований стан у стеку (щоб не внести його в стек двічі), за час О(1). Як тільки будуть визначені й внесені в другий стек нові стани, можна просто поміняти стеки місцями (вихідним стеком стає другий, а внесення нових станів здійснюється в перший стек). Оскільки кожен недетермінований стан має не більше двох вихідних переходів, він може привести не більш ніж до двох нових станів. Позначимо через |N| кількість станів N. Оскільки в стеку може перебувати не більше |N| станів, обчислення наступної множини станів з поточного може бути виконане за час, пропорційний |N|. Отже, час, необхідне для моделювання поводження N при вхідному рядку х, пропорційний |N|x|х|.

Приклад 3.5

Нехай N – НКА, представлений на рис. 3.13, а х — рядок, що складається з одного символу а. Початковий стан являє собою ε-closure({0}) = {0, 1, 2, 4, 7}. Для вхідного символу а є переходи від 2 до 3 і від 7 до 8. Таким чином, Т = {3, 8}. ε-closure(T) дає наступний стан (1, 2, 3, 4, 6, 7, 8). Оскільки жодне із цих недетермінованих станів не є заключним, алгоритм повертає "ні".

Помітимо, що алгоритм 3.4 виконує побудову підмножини в процесі роботи. Наприклад, зрівняємо описані вище переходи зі станами ДКА на рис. 3.13, побудованого із НКА на рис. 3.11. Початкове й наступне за ним для вхідного символу а множини станів відповідають станам А й В ДКА.