C++ NFA到DFA在C+中的实现+;
标题说明了一切。我需要一些想法。 nfa输入看起来像这样,没有ε移动C++ NFA到DFA在C+中的实现+;,c++,c++11,finite-automata,automata-theory,C++,C++11,Finite Automata,Automata Theory,标题说明了一切。我需要一些想法。 nfa输入看起来像这样,没有ε移动 1 2 0 a 2 1 b 3 等,这意味着1和2 ar最终状态,以及使用“a”我可以从状态0到状态2 我用 因为我不能创建状态123或类似的东西。 我如何检查多集是否已在某个状态下转换?在最坏的情况下,具有n个状态的NFA将需要具有2^n个状态的DFA:NFA中的每个状态子集都有一个状态。考虑这一点的另一种方式是,如果NFA的第k个状态包括在DFA状态对应的子集中,则DFA的所有状态都可以用长度为n的二进制字符串标记,其中
1 2
0 a 2
1 b 3
等,这意味着1和2 ar最终状态,以及使用“a”我可以从状态0到状态2
我用
因为我不能创建状态123或类似的东西。
我如何检查多集是否已在某个状态下转换?在最坏的情况下,具有n个状态的NFA将需要具有2^n个状态的DFA:NFA中的每个状态子集都有一个状态。考虑这一点的另一种方式是,如果NFA的第k个状态包括在DFA状态对应的子集中,则DFA的所有状态都可以用长度为n的二进制字符串标记,其中第k个位被设置为1 好的,这可能是一个需要解析的密集解释。举个例子会有帮助。假设NFA有状态0、1和2。有2^3个州的子集,因此我们的DFA最多有8个州。位字符串如下所示:
- 000:空集,不包含任何状态
- 001:仅包含状态0的集
- 010:仅包含状态1的集合
- 100:仅包含状态2的集合
- 011:包含状态0和1的集合
- 101:包含状态0和2的集合
- 110:包含状态1和状态2的集合
- 111:包含所有状态的集合
- 0:空集,不包含任何状态
- 1:仅包含状态0的集
- 2:仅包含状态1的集合
- 3:仅包含状态2的集合
- 4:包含状态0和1的集合
- 5:包含状态0和2的集合
- 6:包含状态1和状态2的集合
- 7:包含所有状态的集合
struct nod
{
int ns;
char c;
};
vector<nod> v[100];
0 a 1
0 a 2
0 a 3