Algorithm NFA到DFA转换的简明描述?

Algorithm NFA到DFA转换的简明描述?,algorithm,finite-automata,dfa,nfa,Algorithm,Finite Automata,Dfa,Nfa,有没有比我聪明得多的人能向SO社区简要描述NFA到DFA的转换算法?(最好是500字或更少)我看过一些图表和讲座,这些图表和讲座只会混淆我认为我曾经知道的东西。我最有信心从状态图生成初始NFA转换表,但在那之后,我在ε和子集中丢失了DFA 1) 在转换(增量)表中,哪一列表示新的DFA状态?它是生成状态的第一列吗 2) 在我下面示例的第0列第{2,3}行中,{2,3}对于NFA的状态图意味着什么?(对不起,我必须用图片来思考。)我假设这将是DFA中的“输入0上的循环” 3) 从表中获取DFA或识

有没有比我聪明得多的人能向SO社区简要描述NFA到DFA的转换算法?(最好是500字或更少)我看过一些图表和讲座,这些图表和讲座只会混淆我认为我曾经知道的东西。我最有信心从状态图生成初始NFA转换表,但在那之后,我在ε和子集中丢失了DFA

1) 在转换(增量)表中,哪一列表示新的DFA状态?它是生成状态的第一列吗

2) 在我下面示例的第0列第{2,3}行中,{2,3}对于NFA的状态图意味着什么?(对不起,我必须用图片来思考。)我假设这将是DFA中的“输入0上的循环”

3) 从表中获取DFA或识别结果DFA的接受状态时,有什么简单的“经验法则”吗

有限自治

delta  |  0    |  1     |
=======+=======+========+
{1}    |{1}    |{2}     |
{2}    |{3}    |{2,3}   |
{3}    |{2}    |{2,4}   |
{2,3}  |{2,3}  |{2,3,4} |
{2,4}  |{3,4}  |{2,3,4} |
{2,3,4}|{2,3,4}|{2,3,4} |
{3,4}  |{2,4}  |{2,4}   |

编辑:这是上面的表格,谢谢

digraph dfa {
    rankdir = LR;
    size = "8,5"
/*  node [shape = doublecircle]; "1";*/
    node [shape = circle];

    "1" -> "1" [ label = "0" ];
    "1" -> "2" [ label = "1" ];

    "2" -> "3"   [ label = "0" ];
    "2" -> "2_3" [ label = "1" ];

    "3" -> "2"   [ label = "0" ];
    "3" -> "2_4" [ label = "1" ];

    "2_3" -> "2_3"   [ label = "0" ];
    "2_3" -> "2_3_4" [ label = "1" ];

    "2_4" -> "2_3"   [ label = "0" ];
    "2_4" -> "2_3_4" [ label = "1" ];

    "2_3_4" -> "2_3_4" [ label = "0" ];
    "2_3_4" -> "2_3_4" [ label = "1" ];
    "3_4" -> "2_4" [ label = "0" ];
    "3_4" -> "2_4" [ label = "1" ];
}
这里是呈现形式:


注意:表格缺少任何关于状态接受的信息,因此图表也是如此。

核心思想可能是理解DFA是一种叠加在NFA上的机器。虽然NFA在节点数量或其与问题的关系方面更简单,但其规则相当微妙和复杂(它进入正确的状态,无论哪种状态)。就其包含的节点而言,dfa要复杂得多,但有非常简单的规则,因为任何给定的输入都只有一个输出状态

这一转变相当艰难。DFA中的每个状态都是NFA中状态的子集。DFA的开始状态是仅包含NFA的开始状态的集合,DFA的接受状态是其所有状态,其中NFA的接受状态为元素

DFA中的过渡是唯一棘手的一方。NFA是不确定的,因为其给定输入的输出状态是一组状态,但DFA将相应的NFA状态集作为其自己的状态,表示自动机可能处于哪种NFA状态。因此,任何给定输入的任何DFA状态的输出状态都是该DFA状态的所有NFA状态的输出状态的并集


就实际实现而言,DFA有一个状态总体,它本质上是NFA状态的动力集。即,n个NFA州的2^(n)。实际上,它通常要小得多,但没有通用的方法来预测它的大小,因此一些实用的NFA到DFA实现在到达DFA状态时动态生成并缓存它们。一旦创建了一定数量的状态,最近使用最少的状态将被丢弃,从而限制缓存的大小

当您从NFA构建DFA时,基本上可以找到NFA在一段时间内可以处于的状态集(就像模拟NFA一样)。首先从开始状态开始,然后查找通过ε变换可以达到的所有状态。这组状态构成结果DFA的开始状态。然后,按照此状态集的传出转换进行操作。这些可能会导致另一个NFA状态,因为您会再次发现通过epsilon输入可以访问的状态,并且您将获得另一组NFA状态,这将是一个新的DFA状态。您将执行此过程,直到完成为止

关键是,生成的DFA状态将成为兼容的旧NFA状态集(关于ε跃迁)。这些集合也可能重叠,这是没有错误的。现在我可以回答你们的问题了:

1) 第一列表示新的DFA状态。它显示了构成给定DFA状态的NFA状态集

2) 您的假设是正确的,这意味着在0输入上返回到状态{2,3}

3) DFA表可以很容易地从这个表中构造出来,只需用字母命名您的州。任何包含至少一个NFA接受状态的DFA状态也将成为DFA中的接受状态

我希望我说得足够清楚。

假设输入NFA是(S,Q,q0,T,F),其中S是输入符号集,Q是状态集,q0是开始状态,T是转换集,F是接受状态集。每个转换都是一个三元组(q,s,r),其中q和r是状态,s是长度为0或1的字符串

对于任何有限字符串s,设D(s)是所有状态的集合,这些状态可以从q0沿着一条过渡路径到达,这些过渡路径的标签连接在一起形成s

该算法需要做的是构造一个确定性自动机,其状态是Q的子集,这样对于任何字符串s,DFA将最终处于状态D(s)

如果是这种情况,那么任何包含NFA接受状态的DFA状态都应该是DFA的接受状态


考虑空字符串epsilon;D(“”)将是q0的epsilon闭包,即从q0可以达到的所有状态,仅在标记为空字符串的转换之后。让我们称之为Q0。(在您的示例D(“”={1})中,现在我们“探索”该状态,这意味着:对于每个输入符号a,您将计算出该符号的转换位置,即该状态之外的位置。这将导致您发现更多需要在DFA中的状态。(在你的例子中,S={0,1},所以这些状态将是D(“0”)={1}和D(“1”)={2}。但是D(“0”)和D{2}是一样的;所以它不是新的。所以现在唯一已经发现但没有探索的状态是D(“1”))然后继续探索状态,直到没有更多的状态被发现,但还没有被探索。

00ps,我忘了我的例子。让我很快把它打进去……RE:2)这对原始NFA意味着什么?RE:3)如果在上面的例子中4是一个接受状态,那么相应的DFA接受状态会是{2,4},{2,3,4}和{3,4}2)你能从中读到的只有