【发布时间】:2011-05-25 23:19:08
【问题描述】:
比我更聪明的人可以向 SO 社区简洁地描述 NFA 到 DFA 的转换算法吗? (最好是 500 字或更少。)我看到的图表和讲座只会混淆我以为我曾经知道的东西。我最有信心从状态图中生成初始 NFA 转换表,但在那之后,我丢失了 epsilons 和子集中的 DFA。
1) 在转换(增量)表中,哪一列代表新的 DFA 状态?它是生成状态的第一列吗?
2) 在下面示例的第 {2,3} 行第 0 列中,{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} |
编辑:这是dot format 中的上表,为 Regexident 加油。
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" ];
}
这里是渲染的形式:
注意:该表缺少有关州接受度的任何信息,因此图表也是如此。
【问题讨论】:
-
00ps,我忘记了我的例子。让我快点打它...
标签: algorithm finite-automata dfa nfa