DFA subsetConstruct2(NFA nfa) {
DFA d;
// 构造Σ
d.sigma = nfa.sigma;
map<int, int> binary; // 第一个int是二进制转十进制的编号,第二个int是在子集构造中的行号
binary.insert(pair<int, int>(1, 0));
int binaryIndex = 1;
SqQueue queue;
initQueue(queue);
for (int a = 0; a < d.sigma.size(); a++)
{
set<int> dfaSet = { 0 };
dfaSet = delta(nfa, 0, a);
int setBinary = 0;
set<int>::iterator iter;
for (iter = dfaSet.begin(); iter != dfaSet.end(); iter++) { //计算该状态集合的二进制值
setBinary += pow(2, *iter);
}
if ( !binary.count(setBinary) ) // 如果该状态集合从未入过队,则入队
{
binary.insert(pair<int, int>(setBinary, binaryIndex)); // 用map保存,表示该状态集合已入过队
enQueue(queue, dfaSet);
d.fun[0][a] = binaryIndex++; // 保存到子集构造
}
else
{
d.fun[0][a] = binary[setBinary];
}
}
while (queue.front != queue.rear) // 队列不为空
{
set<int> deSet = { 0 };
deSet = deQueue(queue);
for (int a = 0; a < d.sigma.size(); a++) // 多种输入字符
{
int lineNum = 0;
set<int> dfaSet = { 0 }; // DFA的状态集合
set<int>::iterator iter;
for (iter = deSet.begin(); iter != deSet.end(); iter++)
{
lineNum += pow(2, *iter);
set<int> deltaSet = { 0 };
deltaSet = delta(nfa, *iter, a);
set_union(deltaSet.begin(), deltaSet.end(), dfaSet.begin(), dfaSet.end(), inserter(dfaSet, dfaSet.begin()));
}
int setIndex = 0;
for (iter = dfaSet.begin(); iter != dfaSet.end(); iter++) { // 计算该状态集合的二进制值
setIndex += pow(2, *iter);
}
if ( !binary.count(setIndex) ) // 如果该状态集合从未入过队,则入队
{
binary.insert(pair<int, int>(setIndex, binaryIndex)); // 用map保存,表示该状态集合已入过队
enQueue(queue, dfaSet);
d.fun[ binary[lineNum] ][a] = binaryIndex++;
}
else
{
d.fun[ binary[lineNum] ][a] = binary[setIndex];
}
}
}
return d;
}
【自动机】丑陋的子集构造
最新推荐文章于 2025-04-24 11:44:54 发布