Нка
Зачем?
Множество состояний, достижимых из состояния q ТОЛЬКО по ε-переходам
Алгоритм нахождения ε-closure(Q).
Формальное доказательство эквивалентности автоматов опустим – кому интересно, вот тут можно почитать его, а тут – посмотреть. Но я забыл рассказать про одну важную вещь! Как находить множество ε-closure(Q)?
Request from 185.204.24.170 via cp3067 cp3067, Varnish XID 163038480
Upstream caches: cp3067 int
Error: 429, Too many requests at Wed, 02 Oct 2024 03:20:02 GMT
Идея: берём каждую вершину и проходим из неё по всевозможным ε-переходам. В конечное мно-во добавляем только уникальные состояния, в которые мы смогли прийти. Также нужно уточнить, что в каждую вершину можно попасть из себя же по ε-переходу.
Номер итерации: 4
Q’: S, B, DE, F
Queue: G
Cur: G
delta δ’: δ(G, 1)
Пачка определений
Операция
Сложность. Так как количество подмножеств множества состояний НКА не более, чем , а каждое подмножество мы обрабатываем ровно один раз за время O(n), получаем верхнюю оценку времени работы алгоритма — O().
Вход: НKA = (Q, Σ, δ, q0, F).
Выход: ДКА = (Q’, Σ, δ’, q0′, F’).
Приветствую, коллеги! Предлагаю Вам окунуться в мир теории формальных языков, в частности, в парадигму конечных автоматов.
Вход: Q
Выход: ReachableStates
Номер итерации: 5
Q’: S, B, DE, F, G
Queue: H
Cur: H
delta δ’: δ(H, ,)
Алгоритм Томпсона
Концептуально изменился наш автомат? Ну не. Допустим нам пришёл на вход символ a – в первом случае мы сначала перейдем по ε-переходу, а затем по символу а перейдём в . Во втором случае мы сразу же перейдём по символу а в .
Отлично! Из-за разности реализации конечных автоматов и разных языков программирования я приведу в качестве алгоритма псевдокод. В конце статьи Вы можете найти ссылку на репозиторий, где реализован данный алгоритм на C#.
Шаг 1. Помещаем в очередь Queue множество, состоящее только из стартовой вершины.
Шаг 2. Затем, пока очередь не пуста выполняем следующие действия:
If you report this error to the Wikimedia System Administrators, please include the details below.
Предлагаю вам самим попробовать пройтись по этому алгоритму и найти ε-closure(Q) для данного КА с Q = :
Номер итерации: 6
Q’: S, B, DE, F, G, H
Queue: J
Cur: J
delta δ’: δ(J, 2) – переход в состояние qfE
ε-переход – это переход по пустому символу. Нам на вход подаётся строка, которую мы считываем по одному символу. Считали символ – выполнили по этому символу переход к следующему состоянию. Считываем следующий и так далее. А ε-переход сигнализирует о том, что для перехода к состоянию нам вообще не нужен символ – берёшь и переходишь. Согласитесь, что было бы классно их убрать? Посмотрите на картинку ниже:
Как сделать из НКА ДКА? Убрать одноимённые переходы и избавиться от ε-переходов. В алгоритме Томпсона если рассматривать КА как граф, то это классический BFS (обход в ширину), с схлопыванием ε-переходов и объединением состояний, в которые ведут одноимённые переходы. Давайте к алгоритму, а затем и к примеру – там будет понятнее.
Хорошо, кажется, теперь все звёзды сошлись и пора приступить к алгоритму. На самом деле, способов есть два: алгоритм Томпсона и составление таблицы переходов. Но в рамках данной статьи ограничусь лишь первым, так как считаю его более понятным.
Цель данной статьи: познакомить Вас с алгоритмом построения детерминированного конечного автомата из недетерминированного конечного автомата. И сразу куча вопросов: зачем понадобилось данное преобразование, что такое конечный автомат, что такое ДКА и НКА и зачем мне это знать? Начнём с мотивации.
Ответ
На этой итерации мы схлопываем два состояния (qf и E) в одно (qfE), так как в оба состояния ведёт один и тот же терминал – 2.
Номер итерации: 7
Q’: S, B, DE, F, G, H, J, qfE
Queue: qfE
Cur: F
delta δ’: δ(qfE, 0) – переход в состояние F
Детерминированный конечный автомат (ДКА) – это КА, у которого гарантированно нет случая, описанного выше, а также отсутствуют ε-переходы. Более формально: не существует δ( , a) = и δ( , a) =
Множество состояний НКА, в которые мы можем перейти из q ∈ Q по символу а
Множество состояний, достижимых из КАКОГО-ЛИБО состояния q ∈ Q ТОЛЬКО по ε-переходам
Любой алгоритм можно представить в виде автомата. Обоснованность данного высказывания стоит искать в теории вычислений, связанной с небезызвестной машиной Тьюринга. Теория — это классно, теория — это супер… давайте практику.
Следуя вышеописанному алгоритму, получим ε-closure(Q) = .
На этой итерации мы схлопываем ε-переход, получая состояние DE, вместо D и E.
Номер итерации: 2
Q’: S, B
Queue: D
Cur: DE
delta δ’: δ(DE, 0)
Недетерминированный конечный автомат (НКА) – это КА, у которого есть 2 и более переходов по одному и тому же символу. Давайте на примере.
Описание
Этот трюк нам пригодится в алгоритме. Теперь, зная, что означает ε, нужно ввести 3 операции:
Регулярные выражения строятся на КА.
Синтаксические анализаторы работают на КА – привет, компиляторы!
Известный алгоритм поиска множества паттернов в тексте Ахо-Корасик использует идею конечного автомата.
Теперь, зная всё это, мы можем подойти к примеру преобразования.
Пример. Задан недетерминированный конечный автомат ∑ = :
F не добавляем, так как оно уже есть в мно-ве
Номер итерации: 8
Q’: S, B, DE, F, G, H, J, qfE
Queue: ∅
Cur: ∅
delta δ’: —
Отлично, с этим разобрались! Ещё парочка определений.
А давайте возьмём и упростим наш автомат – схлопнем ребро с ε-переходом. Он же нам совсем не нужен, ещё и автомат сократим. А давайте:
И я утверждаю, что если захотеть, можно из НКА сделать ДКА, причём они будут эквиваленты! Но для этого стоит разобраться с тем загадочным символом ε. Это важно для нашего алгоритма.
Надеюсь, этого достаточно, чтобы убедить вас в важности понимать данную конструкцию ?
Нужно получить эквивалентный ДКА.
Конец. Как и обещал, ссылка на репозиторий, где реализован данный алгоритм.
Q – это все большие кружочки, обозначающие состояния КА. В данном примере Q = < , . >. Символы, обозначающие такие состояния называют нетерминальными.
Конечный автомат (КА) – пятёрка объектов, вместе образующих единую систему. Более формально: КА = Q, ∑, δ, , F>, где Q – конечное мн-во состояний, ∑ — входной алфавит, δ – правила перехода, ∈ Q — начальное состояние, F ∈ Q — конечное мн-во заключительных состояний.
= < >— это состояние, из которого начинается автомат.
F = < >— состояние, в котором КА заканчивается. На рисунках часто обозначают как двойной кружок, либо к нетерминальному символу приписывают нижний индекс f.
Это очень маленький НКА – из существуют как минимум два правила перехода с символом a. По какому же правилу нам пойти? Если встали на подобную развилку, то программист сам решает, куда направиться дальше. Но что, если нам нужна определённость? Для этого есть детерминированный КА.
Спасибо за прочтение! Это была моя первая статья на Хабре: буду рад любой критике или похвале. Удачного дня!
Давайте на примере. Дан конечный автомат:
δ – А это некий свод правил, показывающий, как КА будет совершать переход. На рисунке эти правила представляют собой стрелочки. Записывается правило так: δ( , a) =
Т.е. пройдя из состояния по символу a попадём в состояние . Часто равенство не пишут, просто обозначая существование такого перехода.
Приведём все шаги алгоритма для данного примера:
delta δ’ – показывает, какое правило перехода мы добавили
Изначально в очередь кладём начальное состояние.
Номер итерации: 0
Q’: ∅
Queue: S
Cur: S
delta δ’: δ(S, 0)
Присоединяйтесь к нам в «ВК» или «Телеграме» и будьте в курсе всех важных новостей санаторно-курортной отрасли!
Источники:
https://gzk.nca.by/&rut=ab2752f4afbf0728f9b257a17ee4e09ad9768bea0bbefd15f412599586faa4fe
https://map.nca.by/&rut=1cd03fb34297b22316c653a58ab87d2b543ab724b3daf6311389d7bdcd50d140
https://ru.wikipedia.org/wiki/%D0%9D%D0%B5%D0%B4%D0%B5%D1%82%D0%B5%D1%80%D0%BC%D0%B8%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%BD%D0%B5%D1%87%D0%BD%D1%8B%D0%B9_%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82&rut=3b9dfa0c424820ca38202180000d659ba7a8473f3a2eb4c5d64677a15b251f76
https://www.youtube.com/channel/UCImuJcfI88kvgZjYET0f0vg&rut=feef80693488d4e1991b3db1f67b89bcc86a41c6c08384431318069da1380e15
https://m.youtube.com/watch?v=HT15xK84w7o&rut=a65b0091bd02ddc7b26549036252f25c6ebae6dba1b5a14a04cbf0a83b2ba570
https://sputnik.by/20240307/nka-razrabotaet-interaktivnuyu-kartu-svobodnykh-zemelnykh-uchastkov-1084291074.html&rut=993b6d03c6b04e4e42452ee9fd853ddda449a25542c10706f9f84b935617c23f
https://habr.com/ru/articles/671742/&rut=13e1d84f65389b31a74aa060127a7a55f986fcb41fa40da177b0ed9e1d8f71bb
https://qna.habr.com/q/529481&rut=391523f535c00d8142eecd7e640144c544e7c7d2d3dd2889deb3f559c599a45f
https://rusnka.ru/&rut=0f4a034f2dc037abb8d2e74775ec1126f2072920e74b2bac98fe044c25a31e08