子集构造算法接受一个NFA,输出一个DFA(输出的还不是最简的DFA)

基本概念

  1. edge(s,c):从状态s出发,沿着c边可以到达的NFA状态集合
  2. closure(S):对于状态集合S,从S中的任意一个节点元素出发,只通过epsilon边就可以到达的状态集合;

    基本操作

  3. epsilon_closure(s):获取从状态s开始,只通过epsilon转换就可以到达的NFA状态节点的集合;

  4. epsilon_closure(T):能够从状态集合T的某个状态出发,只通过epsilon转换就可以到达的状态节点的集合;
  5. move(T,a):能够从集合T中的某个状态s出发,仅仅通过标号为a的转换到达的NFA状态集合;

    算法

    1. //伪代码
    2. while(在Dstates中,有一个没有标记){
    3. T加上标记;
    4. for(每个输入符号a)
    5. {
    6. U = epsilon_closure(move(T,a));
    7. if(U不在Dstates中)
    8. U加入到Dstates中,并且不用加标记;
    9. Dtran[T,a] = U;
    10. }
    11. }
    本质上还是构建了一张转换表;