В теории вычислений и теории автоматов построение powerset или построение subset является стандартным методом преобразования недетерминированного конечного автомата (NFA) в детерминированный конечный автомат (DFA), который распознает тот же формальный язык . Это важно в теории, поскольку устанавливает, что NFA, несмотря на их дополнительную гибкость, не способны распознавать любой язык, который не может быть распознан некоторыми DFA. Это также важно на практике для преобразования более простых в построении NFA в более эффективно исполняемые DFA. Однако, если NFA имеет n состояний, результирующий DFA может иметь до 2 n состояний, экспоненциально большее число, что иногда делает построение непрактичным для больших NFA.
Конструкция, иногда называемая конструкцией множества Рабина–Скотта (или конструкцией подмножества), чтобы отличать ее от аналогичных конструкций для других типов автоматов, была впервые опубликована Майклом О. Рабином и Даной Скотт в 1959 году. [1]
Чтобы смоделировать работу DFA на заданной входной строке, необходимо отслеживать одно состояние в любой момент времени: состояние, которого достигнет автомат после просмотра префикса ввода. Напротив, чтобы смоделировать NFA, необходимо отслеживать набор состояний: все состояния, которых автомат может достичь после просмотра того же префикса ввода, в соответствии с недетерминированным выбором, сделанным автоматом. Если после определенного префикса ввода может быть достигнут набор S состояний, то после следующего входного символа x набор достижимых состояний является детерминированной функцией S и x . Следовательно, наборы достижимых состояний NFA играют ту же роль в симуляции NFA, что и отдельные состояния DFA в симуляции DFA, и фактически наборы состояний NFA, появляющиеся в этой симуляции, могут быть переинтерпретированы как состояния DFA. [2]
Конструкция powerset применяется наиболее непосредственно к NFA, который не допускает преобразований состояний без потребления входных символов (т. е. «ε-ходов»). Такой автомат может быть определен как 5-кортеж ( Q , Σ, T , q0 , F ) , в котором Q — множество состояний, Σ — множество входных символов, T — функция перехода (отображающая состояние и входной символ в множество состояний), q0 — начальное состояние, а F — множество допускающих состояний. Соответствующий DFA имеет состояния , соответствующие подмножествам Q. Начальное состояние DFA — это { q0 } , (одноэлементный) набор начальных состояний. Функция перехода DFA отображает состояние S (представляющее подмножество Q ) и входной символ x в множество T ( S , x ) = ∪{ T ( q , x ) | q ∈ S } , множество всех состояний, которые могут быть достигнуты с помощью x -перехода из состояния в S . Состояние S DFA является принимающим состоянием тогда и только тогда, когда по крайней мере один член S является принимающим состоянием NFA. [2] [3]
В простейшей версии конструкции powerset множество всех состояний DFA является powerset Q , множеством всех возможных подмножеств Q . Однако многие состояния результирующего DFA могут быть бесполезны, поскольку они могут быть недостижимы из начального состояния. Альтернативная версия конструкции создает только состояния, которые фактически достижимы. [ 4]
Для NFA с ε-ходами (также называемого ε-NFA) конструкция должна быть изменена для работы с ними путем вычисления ε- замыкания состояний: множества всех состояний, достижимых из некоторого заданного состояния с использованием только ε-ходов. Ван Норд признает три возможных способа включения этого вычисления замыкания в конструкцию powerset: [5]
Если НКА определены так, чтобы допускать несколько начальных состояний, [7] начальное состояние соответствующего ДКА представляет собой множество всех начальных состояний НКА или (если НКА также имеет ε-движения) множество всех состояний, достижимых из начальных состояний с помощью ε-движений.
Нижеприведенный NFA имеет четыре состояния: состояние 1 является начальным, а состояния 3 и 4 являются принимающими. Его алфавит состоит из двух символов 0 и 1, и он имеет ε-ходы.
Начальное состояние DFA, построенного из этого NFA, представляет собой множество всех состояний NFA, которые достижимы из состояния 1 с помощью ε-ходов; то есть это множество {1,2,3}. Переход из {1,2,3} с помощью входного символа 0 должен следовать либо по стрелке из состояния 1 в состояние 2, либо по стрелке из состояния 3 в состояние 4. Кроме того, ни состояние 2, ни состояние 4 не имеют исходящих ε-ходов. Следовательно, T ({1,2,3},0) = {2,4}, и по тем же соображениям полный DFA, построенный из NFA, выглядит так, как показано ниже.
Как видно из этого примера, из начального состояния DFA достижимы пять состояний; оставшиеся 11 множеств в powerset множества состояний NFA недостижимы.
Поскольку состояния DFA состоят из наборов состояний NFA, NFA с n -состояниями может быть преобразован в DFA с не более чем 2 n состояниями. [2] Для каждого n существуют NFA с n -состояниями, такие, что каждое подмножество состояний достижимо из исходного подмножества, так что преобразованный DFA имеет ровно 2 n состояний, что дает Θ( 2 n ) наихудшую временную сложность. [8] [9] Простым примером, требующим почти такого количества состояний, является язык строк в алфавите {0,1}, в котором есть не менее n символов, n -й от последнего из которых равен 1. Его можно представить с помощью NFA с ( n + 1) состояниями, но для этого требуется 2 n состояний DFA, по одному для каждого n -символьного суффикса ввода; см. рисунок для n = 4. [4 ]
Алгоритм Бжозовски для минимизации DFA использует конструкцию powerset дважды. Он преобразует входной DFA в NFA для обратного языка, обращая все его стрелки и меняя роли начальных и принимающих состояний, преобразует NFA обратно в DFA, используя конструкцию powerset, а затем повторяет свой процесс. Его наихудшая сложность является экспоненциальной, в отличие от некоторых других известных алгоритмов минимизации DFA, но во многих примерах он работает быстрее, чем предполагает его наихудшая сложность. [10]
Конструкция Сафры, преобразующая недетерминированный автомат Бюхи с n состояниями в детерминированный автомат Мюллера или в детерминированный автомат Рабина с 2 O( n log n ) состояниями, использует конструкцию powerset как часть своего механизма. [11]