Regex 给定一系列符号,如何找到能够接受它的最小DFA?

Regex 给定一系列符号,如何找到能够接受它的最小DFA?,regex,pattern-matching,regular-language,fsm,dfa,Regex,Pattern Matching,Regular Language,Fsm,Dfa,例如:给定以下符号序列 a b c b c d d d b c b c d d d d e 可以接受它的最简单的DFA是由17个状态组成的链 而下面的正则表达式可以派生上述序列: a (b c)* (d)* (b c)* (d)* e 相应的最小DFA有8个状态 此外,正则表达式abc*d**e具有更小的具有4个状态的最小DFA。它可以接受示例序列 在上面的例子中,我只考虑*操作符;更一般地说,操作员也可以考虑减小DFA的大小 因此,一般问题是: 给定一系列符号,如何找到能够接受它的最小DF

例如:给定以下符号序列

a b c b c d d d b c b c d d d d e
可以接受它的最简单的DFA是由17个状态组成的链

而下面的正则表达式可以派生上述序列:

a (b c)* (d)* (b c)* (d)* e
相应的最小DFA有8个状态

此外,正则表达式abc*d**e具有更小的具有4个状态的最小DFA。它可以接受示例序列

在上面的例子中,我只考虑*操作符;更一般地说,操作员也可以考虑减小DFA的大小

因此,一般问题是:


给定一系列符号,如何找到能够接受它的最小DFA?

很容易。只有一个状态的DFA总是可以做到这一点。这一状态是一个开始状态、接受状态,所有符号转换都返回到该状态。这个平凡的DFA接受所有字符串∑*, 而且绝对是最小的DFA。

简单。只有一个状态的DFA总是可以做到这一点。这一状态是一个开始状态、接受状态,所有符号转换都返回到该状态。这个平凡的DFA接受所有字符串∑*, 这绝对是最小的DFA

正则表达式->NFA 然后是NFA->DFA 然后DFA->最小DFA 网上有很多算法,你可以在谷歌上搜索每一步。 您可以查看您的DFA/NFA。

正则表达式->NFA 然后是NFA->DFA 然后DFA->最小DFA 网上有很多算法,你可以在谷歌上搜索每一步。 您可以查看您的DFA/NFA。

你在寻找只接受正则表达式描述的序列的最小DFA吗?@cheeken:这样的DFA必须具有与序列一样多的状态,因为任何状态的重用都可能被重复生成其他字符串。@nneonno我不反对,尽管我的问题与描述正则表达式的DFA有关,不是特定的序列。我希望JackWM能澄清他的问题,因为我觉得他可能不会问他想问什么。你是在寻找只接受正则表达式描述的序列的最小DFA吗?@cheeken:这样的DFA必须有与序列一样多的状态,因为任何状态的重用都可以重复生成其他字符串。@nneonneo我不反对,尽管我的问题涉及描述正则表达式的DFA,而不是特定序列。我希望JackWM能澄清他的问题,因为我觉得他可能不会问他对我意味着什么。