C++ NFA到DFA在C+中的实现+;

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的二进制字符串标记,其中

标题说明了一切。我需要一些想法。 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的二进制字符串标记,其中第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:包含所有状态的集合
我们可以将这些位字符串本身解释为整数,这为我们提供了一种标记DFA状态的自然方法:

  • 0:空集,不包含任何状态
  • 1:仅包含状态0的集
  • 2:仅包含状态1的集合
  • 3:仅包含状态2的集合
  • 4:包含状态0和1的集合
  • 5:包含状态0和2的集合
  • 6:包含状态1和状态2的集合
  • 7:包含所有状态的集合
这种排序的唯一问题是,如果最终不需要所有状态(通常不需要),那么所使用的状态之间可能存在(有时很大)差距。您的DFA可能只需要状态1、2和3(例如,如果您的NFA恰好已经是最小DFA)。也许你只需要状态1和状态7。还有其他可能性

如果您是按需创建状态,则始终可以将要创建的状态的名称和索引分开。如果已经创建了k个状态,并根据需要创建了一个新状态,则可以将其指定为索引k+1,并根据位字符串命名。这样,您的索引被密集地打包在一起,并且您可以通过名称追溯到NFA状态的子集

我需要一个如何命名新的国家时,有一个多集的国家,如

根据相应子集的位字符串命名它们

我如何检查一个多集是否已经在一个状态下被转换

检查现有状态,查看您遇到的子集的位字符串是否已被使用

struct nod
{
int ns;
char c;
};

vector<nod> v[100];
0 a 1
0 a 2
0 a 3