首先,这不是一个关于如何将NFA转换为DFA算法的问题。
已知(并且已证明), NFA 的等价 DFA 最多有 2n 个状态,尽管大多数情况下它将具有与 NFA 几乎相同数量的状态。
我如何预测 NFA 等价的 DFA 将具有的状态数量的估计?哪种特定类型的 NFA 需要一个等价的 DFA 具有 2n 个状态?
我之所以提出这个问题是为了能够“发明”一些 NFA,这些 NFA 将肯定产生 2n -1 个状态加上“死状态”,而不考虑最小化。
首先,这不是一个关于如何将NFA转换为DFA算法的问题。
已知(并且已证明), NFA 的等价 DFA 最多有 2n 个状态,尽管大多数情况下它将具有与 NFA 几乎相同数量的状态。
我如何预测 NFA 等价的 DFA 将具有的状态数量的估计?哪种特定类型的 NFA 需要一个等价的 DFA 具有 2n 个状态?
我之所以提出这个问题是为了能够“发明”一些 NFA,这些 NFA 将肯定产生 2n -1 个状态加上“死状态”,而不考虑最小化。
首先,我们假设n -> n。
对于每个非确定性转换,如果从一个状态可以到达x个其他状态,就将估计乘以x。由于可能会重复计算,因此这可能不是精确的,但应该可以给出一个上限。
然而,唯一确定的方法是构建相应的DFA,然后计算状态数(我认为)。
最后,您可能可以简化一些DFA(以及NFA),但这是另一个故事……
进一步扩展Jonathan Graehl的出色答案。
对于A(N)
中的每个状态0, 1, ..., N
,添加一个标记为c
的自环,即您添加以下转换:
0 c-> 0
1 c-> 1
...
N c-> N
然后假设c
从状态{S,j,k,...,z} <> {S}
观察到时,DFA包含与Jonathan的DFA相同的2^(N+1)
个状态。因此,除了空集和DFA具有N+2
个状态的情况外,所有{S,0,...,N}
的子集都是可能的,而DFA具有2^(N+2)-1
个状态。
将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
,以便当字符串意外结束时,你可以判断N个字母前是否有a
)。
我不确定这是否正好符合您想要的状态数量,但至少是在因子2范围内 - 所有的{0,...,N}
子集都是可能的,但你也总是在S
。这应该是2^(N+1)
个状态,但A(N)
有N+2
个状态。