(#BYYL-3-99) NFA构造DFA的子集算法

(#BYYL-3-99) NFA构造DFA的子集算法

NFA构造DFA的子集算法

输入:一个NFA N

输出:一个DFA D

方法:为D构造一个转换表Dtran。D的每一个状态是一组NFA状态的集合。以下是一些构造需要用到的函数。

操作

描述

ε-closure(s)

能够从NFA的状态s开始只通过ε转换到达的NFA状态集合

ε-closure(T)

UTε-closure(s)

move(T,a)

能够从T中某个状态S出发通过标号为a的转换到达的NFA状态的集合

Ø 构造D的状态集合DStates和D的转换函数Dtran

一开始,ε-closure(s)是DStates中的唯一状态,且没有被标记;

while (DStates中存在未被标识的状态T) {

标识T;

for(每个输入符号a) {

U = ε-closure(move(T,a));

if(U不再DStats中) 将U加入DStates,且没有标识;

Dtran[T,a] = U;

}

}

Ø 计算ε-closure(T)的算法

将T的所有状态压入堆栈中;

ε-closure(T)的内容初始化为T;

while (堆栈非空) {

将栈顶元素t弹出;

for(每个满足如下条件的u:从t出发有一个标号为ε的转换到达状态u)

if(u不再ε-closure(T)中){

将u加入到ε-closure(T)中;

将u压入栈中;

}

}

Ø 附模拟一个NFA

S = ε-closure(s0);

c = nextChar();

while(c != eof) {

S = ε-closure(move(S,c));

c = nextChar();

}

if(S ∩ F != ø) return true;

else return false;




</script>

你可能感兴趣的:((#BYYL-3-99) NFA构造DFA的子集算法)