怎么确定NFA到DFA的转化的终态和初态

一、讲解

1.NFA确定化的时候,
(1)DFA的初态是包含了NFA初态的那个DFA状态;
(2)DFA的终态是所有包含了NFA终态的DFA的状态。

2.就如下边的例子,是一个初态为{1},终态为{6,7,9}的NFA经过确定化得到的转换矩阵,右侧是将左侧的转换矩阵改名之后的DFA,也就是最后得到的DFA。
答:对于DFA来说,
(1)他的初态就是包含了NFA唯一初态{1}的那个状态,就是左边I那一列所对应的{1,2},即右边Q那一列所对应的{1};
(2)终态则是左边的I那一列所对应的{2,4,5,6,7}、{3,8,9}、{9}即右边Q那一列所对应的{2},{4},{5}。

在这里插入图片描述

二、教材习题练习

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 12
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个NFA状态转换图的示例,其中0为初态,10为终态: ``` ┌───a──→1──────┐ │ │ │ ε ▼ 0 ▶───b──→2───c─►3───▶10 │ ▲ │ │ │ │ └──────┘ ▼ └───────4 ``` 接下来,我们将对该NFA进行确定化,得到一个DFA状态转换图: ``` a b c 0 → {1,2} → {2,3} → {3,4} → {10} ``` 该DFA初态为{1,2},终态为{10}。以下是该DFA的状态转换表: | 状态 | a | b | c | | ---- | - | - | - | | {1,2} | {1,2} | {2,3} | ∅ | | {2,3} | {3,4} | {2,3} | ∅ | | {3,4} | ∅ | ∅ | {10} | | {10} | ∅ | ∅ | ∅ | 以下是使用C++代码实现该DFA的状态转换表: ```cpp #include <iostream> #include <unordered_map> #include <set> #include <vector> using namespace std; // 定义状态类型 using State = set<int>; // 定义状态转换表类型 using StateTable = unordered_map<State, unordered_map<char, State>>; // 定义状态集合类型 using StateSet = vector<State>; // 获取状态的闭包 void epsilon_closure(const StateTable& nfa, State& s) { StateStack stack; stack.push(s); while (!stack.empty()) { auto t = stack.top(); stack.pop(); for (int i : t) { auto it = nfa.find(i); if (it != nfa.end()) { auto jt = it->second.find('\0'); if (jt != it->second.end()) { for (int j : jt->second) { if (t.find(j) == t.end()) { t.insert(j); stack.push(t); } } } } } } } // 获取状态的转换集合 State get_transition(const StateTable& nfa, const State& s, char c) { State t; for (int i : s) { auto it = nfa.find(i); if (it != nfa.end()) { auto jt = it->second.find(c); if (jt != it->second.end()) { for (int j : jt->second) { t.insert(j); } } } } return t; } // 获取DFA的状态转换表 StateTable get_dfa(const StateTable& nfa, const State& start) { StateTable dfa; StateSet stateset; StateStack stack; State start_ec(start); epsilon_closure(nfa, start_ec); stateset.push_back(start_ec); stack.push(start_ec); while (!stack.empty()) { auto s = stack.top(); stack.pop(); for (char c = 'a'; c <= 'c'; c++) { auto t = get_transition(nfa, s, c); if (!t.empty()) { State t_ec(t); epsilon_closure(nfa, t_ec); if (find(stateset.begin(), stateset.end(), t_ec) == stateset.end()) { stateset.push_back(t_ec); stack.push(t_ec); } dfa[s][c] = t_ec; } } } return dfa; } int main() { // NFA状态转换表 StateTable nfa = { {{0}, {{'b', {1,2}}}}}, {{1,2}, {{'a', {1,2}}, {'c', {3}}}}}, {{3}, {{'\0', {4}}}}}, {{4}, {{'\0', {3}}}, {'c', {10}}}} }; // NFA初态终态 State start = {0}; State end = {10}; // 获取DFA状态转换表 auto dfa = get_dfa(nfa, start); // 输出DFA状态转换表 for (auto& s : dfa) { cout << "{"; for (int i : s.first) { cout << i << ","; } cout << "}"; for (char c = 'a'; c <= 'c'; c++) { auto it = s.second.find(c); if (it == s.second.end()) { cout << " " << c << "->{}"; } else { cout << " " << c << "->{" ; for (int i : it->second) { cout << i << ","; } cout << "}"; } } cout << endl; } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

csndsx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值