NFA в DFA вопрос

Во-первых, это не вопрос алгоритма преобразования NFA в DFA.

Известно (и доказано), что DFA, эквивалентный NFA, имеет не более 2n состояний, хотя в большинстве случаев он будет иметь более или менее такое же количество состояний, что и NFA.

Как я могу предсказать оценку количества состояний, которые будет иметь NFA-эквивалентный DFA? Для какого конкретного типа NFA потребуется, чтобы эквивалентный DFA имел 2n состояний?

Я спрашиваю об этом, чтобы иметь возможность «изобрести» некоторые NFA, которые, безусловно, будут давать, без учета минимизации, 2n - 1 состояний плюс «мертвое состояние».


person nunos    schedule 07.01.2010    source источник
comment
Я прошла этот курс 5 лет назад. Приведите пример NFA, не так ли?   -  person Hamish Grubijan    schedule 07.01.2010
comment
NFA — это конечный автомат, в котором для данного состояния и данного входного токена существует более одной возможности перехода. Таким образом, NFA может быть таким, в котором вы можете перейти из состояния 1 в состояние 2 или состояние 3, используя «a», или с петлями, или с эпсилон-переходами (переходами, которые не требуют ввода токена).   -  person danben    schedule 07.01.2010
comment
Вы имеете в виду, как программно предсказать количество состояний, которые будет иметь DFA, без фактического создания DFA? Мне кажется, что любой алгоритм предсказания количества состояний по сути эквивалентен алгоритму, генерирующему сам автомат, поэтому предсказание количества состояний не спасет вас от работы. Но я буду приятно удивлен, если кто-то скажет мне по-другому. Я думаю, что NFA с максимальным недетерминированным ветвлением даст самый сложный DFA.   -  person Nate C-K    schedule 07.01.2010


Ответы (4)


Количество состояний резко возрастает из-за недетерминизма, что является ключом к вашему вопросу.

Если вы возьмете NFA, где каждый переход определен однозначно, то есть детерминированный NFA, то это не что иное, как обычный DFA. Однако если у вас есть состояние, в котором возможны два перехода, оно отличается от DFA.

Рассмотрите алгоритм преобразования и посмотрите, что произойдет, если у вас есть два или более перехода с одной и той же меткой для состояния. Здесь вам нужны те новые состояния, которые соответствуют наборам состояний.

Таким образом, вопрос сводится к выяснению того, сколько из этих супермножеств на самом деле достижимо. Конечно, вы можете придумать для этого причудливый алгоритм, но чтобы получить правильное число, просто запустите обычный алгоритм преобразования и удалите недостижимые состояния.

Что касается NFA с n состояниями, для которых эквивалентный DFA имеет 2 ^ n состояний, подумайте об использовании недетерминизма. Первая идея заключалась бы в том, чтобы пометить все переходы одинаково, однако это не очень хорошо работает. Вместо этого помните, что вам нужно каким-то образом достичь всех подмножеств состояний с некоторой меткой каждое.

Если не считать начальное состояние, то можно сделать следующую конструкцию: создать n узлов и для каждого набора из 2^n создать уникальную метку и в NFA добавить переход с этой меткой к каждому узлу этого набора. Это дает вам NFA с n+1 состояниями (1 — начальное состояние), где DFA требует 2^n +1 состояний. Конечно, это становится сложнее, если вы хотите иметь 2 ^ n состояний DFA после минимизации.

person Frank    schedule 07.01.2010
comment
@Frank - есть ли доказательство нижней границы (ссылка?) - например. семейство NFA, для которых минимальный DFA, принимающий один и тот же язык, растет экспоненциально по количеству состояний в NFA? - person shaunc; 26.04.2017

Хорошо, начнем с предположения, что n -> n. Теперь для каждого недетерминированного перехода, при котором из одного состояния вы можете попасть в x других состояний, умножьте свою оценку на x. Это может быть неточным, так как вы можете дважды считать. Но это должно дать вам верхнюю границу.

Однако единственный верный способ — построить соответствующий DFA, а затем подсчитать состояния (я так думаю).

Наконец, вы, вероятно, можете упростить некоторые DFA (и NFA, если уж на то пошло), но это совершенно новая история...

person Hamish Grubijan    schedule 07.01.2010
comment
Я не совсем уверен, что это полезно. Рассмотрим NFA с состояниями 1, 2 и 3, где есть переход от 1 к 2 и от 1 к 3 на токене «a». 2 и 3 являются окончательными. Результирующий DFA имеет меньше состояний и меньше переходов, чем NFA из-за слияния. Поэтому умножение кажется шагом в неправильном направлении. - person danben; 07.01.2010
comment
Я дал вам грубую верхнюю границу, потому что вы можете представить NFA там, где действительно имеет место наихудший случай. Кроме этого, вам придется фактически преобразовать NFA в DFA, а затем подсчитать состояния. Это все равно, что сказать: у меня есть программа с 10 операторами if и без рекурсии или циклов for — сколько в ней путей кода? Ну, может быть только один путь кода, но вы должны стрелять в худшем случае и не можете сказать, сколько точно, без тщательного осмотра, или компиляции в сборку и подсчета инструкций перехода, или что у вас есть ... - person Hamish Grubijan; 07.01.2010
comment
Что вы подразумеваете под n -> n? Спасибо. - person nunos; 07.01.2010
comment
Ужасная запись: n соответствует /maps n. - person Hamish Grubijan; 07.01.2010
comment
Интересно, конверсия NFA › R.E. › ЦФА осуществим/полезен для целей упрощения. Р.Э. = регулярное выражение - person Hamish Grubijan; 07.01.2010
comment
Это ответ на вопрос, отличный от заданного, поскольку он уже знает, какова верхняя граница. - person ; 08.01.2010

Возьмем в качестве функции N, с начальным состоянием S и конечным состоянием N, этот NFA A(N):

S a-> S
S b-> S
S a-> 0 // NOTE: only "a" allows you to leave state S
0 a-> 1
0 b-> 1
1 a-> 2
1 b-> 2
...
N-1 a-> N
N-2 b-> N
N

Должно быть очевидно, что это принимает все строки в [ab]*, у которых N-ая от последней буква равна a.

Определение A(N) должно эффективно запоминать предыдущие буквы N-1 (вам нужно знать все позиции в этом окне, которые были a, чтобы, когда строка неожиданно заканчивается, вы могли сказать, было ли a N букв назад) .

Я не уверен, соответствует ли это именно тому количеству состояний, которое вы хотели, но оно, по крайней мере, в пределах 2 — возможны все подмножества {0,...,N}, но вы также всегда находитесь в S. Должно быть 2^(N+1) состояний, но A(N) было N+2 состояний.

person Jonathan Graehl    schedule 17.10.2011

Чтобы еще больше расширить превосходный ответ Джонатана Граэля.

Добавьте к каждому состоянию 0, 1, ..., N из A(N) автопетлю, помеченную c, т. е. вы добавите следующие переходы:
0 c-> 0
1 c-> 1
...
N c-> N

Затем, предполагая, что c никогда не срабатывает, DFA содержит те же 2^(N+1) состояний, что и DFA Джонатана. Однако всякий раз, когда c наблюдается из состояния {S,j,k,...,z} <> {S}, мы достигаем состояния {j,k,...,z}. Следовательно, все подмножества {S,0,...,N} возможны, кроме пустого набора, и DFA имеет 2^(N+2)-1 состояний, а A(N) имеет N+2 состояний.

person Alessandro Giua    schedule 23.04.2015