如何检查我的线是否与NFA匹配?

时间:2017-04-16 18:50:51

标签: python algorithm nfa automaton

我使用正则表达式3d数组制作NFA,例如(01 *)表达式。我明白了:

[[FROM,TO,TRANSITION]]

    [['q0', 'q1', '0'], ['q1', 'q2', ':e:'] ,['q1', 'q4', ':e:'] ,
    ['q2', 'q3', '1'], ['q3', 'q2', ':e:'], ['q3', 'q4', ':e:']

如何编写可以测试满足此自动机的字符串的方法?例如,"011111"将返回q0 q1 q2 q3 q2 q3 q2 q3 q2 q3 q2 q3 q4

1 个答案:

答案 0 :(得分:1)

  1. 您可以将自动机转换为DFA(之后检查变得微不足道)。这种方法很有用,因为NFA很小,但你要测试的字符串数量非常大。

  2. 您还可以构建一个新图形,其中每个顶点都是对的(NFA的状态,字符串中的位置)。如果它是一个epsilon过渡,则每个位置的状态和另一个状态之间存在边缘。如果自动机中(s, pos) -> (s', pos + 1)转换的字符与字符串中位置s->s'的字符匹配,则还有一个边pos
    构建图形后,您只需检查至少一个终端状态(t, string.length())是否可以访问一对t(您可以使用任何图形遍历算法进行检查,例如深度优先搜索)。

相关问题