computer-science - NFA 到 DFA 的问题

标签 computer-science finite-automata computation-theory

首先,这不是要求算法将 NFA 转换为 DFA 的问题。

众所周知(并证明)NFA 的等效 DFA 最多具有 2n 个状态,尽管大多数情况下它或多或少具有与 NFA 相同的状态数。

我如何预测 NFA 等效 DFA 将具有的状态数的估计值?哪种特定类型的 NFA 需要等效的 DFA 才能具有 2n 个状态?

我提出这个问题的原因是能够“发明”一些 NFA,这些 NFA 肯定会在不考虑最小化的情况下产生 2n - 1 个状态加上“死状态”。

最佳答案

由于不确定性,状态数量激增,这是您问题的关键。

如果您采用 NFA,其中每个转换都是唯一确定的,即确定性 NFA,那么它只不过是一个普通的 DFA。但是,一旦您拥有可以进行两次转换的状态,它就与 DFA 不同。

考虑转换算法,看看如果您有两个或多个具有相同状态标签的转换会发生什么。这是您需要与状态集相对应的那些新状态的地方。

所以问题归结为找出这些超集状态中有多少实际上是可达的。当然,您可以为此发明一种奇特的算法,但要获得正确的数字,只需运行正常的转换算法并删除无法访问的状态即可。

对于具有 n 个状态的 NFA,其等效 DFA 具有 2^n 个状态,请考虑利用非确定性。第一个想法是将所有转换标记为相同,但是,效果不佳。相反,请记住,您需要能够以某种方式到达状态的所有子集,每个子​​集都有一些标签。

如果不计算起始状态,则可以进行以下构造:创建 n 个节点,并为 2^n 中的每个集合创建一个唯一标签,并在 NFA 中向该集合的每个节点添加带有此标签的转换。这为您提供了具有 n+1 个状态(1 是起始状态)的 NFA,其中 DFA 需要 2^n +1 个状态。当然,一旦你想在最小化后有 2^n 个 DFA 状态,它就会变得更加棘手。

关于computer-science - NFA 到 DFA 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2021890/

相关文章:

c++ - 编译器如何将类的对象实例翻译成二进制机器代码?

regex - Perl 正则表达式可以用于什么类型的语言?

java - 实现 DFA 的最佳方法有哪些?

python - 在 Python 中实现 NFA

algorithm - 精确的输入大小和时间复杂度

c++ - 编译器能否识别模板元编程中的递归问题?

python - 是否有任何计算机语言知道检查不存在的变量和检查是否存在之间的区别?

algorithm - 比较算法成本的正确方法

ruby - 基于匹配的回调正则表达式

computer-science - 用有限状态自动机表示吃 bean 人