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

标签 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. 您可以将自动机转换为 DFA(之后检查变得微不足道)。这种方法在 NFA 很小但要测试的字符串数量相当大的情况下很有用。

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

关于python - 我如何检查我的线路是否与 NFA 匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43440840/

相关文章:

python - 如何在 Python 中测量时间?

python - 如何训练机器标记文本中的单个单词

algorithm - 该算法生成所有可能的有效括号的时间复杂度是多少?

automata - 将 NFA 转换为 DFA

python - 仅在 python 中的双引号后拆分字符串

如果条件存在,Python 将 1 附加到列表,将 0 附加到所有其他列表

python - 根据另一个数据帧列值将数据帧列和行合并到特定索引

algorithm - 给定一个双调数组和数组中的元素 x,在 2log(n) 时间内找到 x 的索引

c++ - 在结构定义中声明一个结构堆栈

regex - 将点星正则表达式转换为 NFA