软件设计师 · 高频练习

子集构造法中,DFA 的初始状态怎么确定?

中级 单选题 第 840 题 中等 软件设计师编译原理NFA转DFAε-closure子集构造法
题目

某带 ε 转移的 NFA 初始状态为 q0,且从 q0 可经 ε 转移到 q1,从 q1 又可经 ε 转移到 q2,除此之外没有新的 ε 转移。使用子集构造法转换为 DFA 时,DFA 的初始状态应为()。

A {q0}
B {q1,q2}
C {q0,q1,q2}
D q2
题目类型:原创高频练习题 用途:用于帮助理解软件设计师相关考点和答案解析,不等同于官方真题。
正确答案
C
答案解析

子集构造法首先求 NFA 初始状态的 ε-closure。它包含 q0 本身,也包含从 q0 只经过 ε 转移能够到达的 q1,以及继续从 q1 经 ε 到达的 q2。因此 DFA 初始状态是集合 {q0,q1,q2}。

选项分析

A

错误。忽略了从 q0 出发不消耗输入即可到达的 q1、q2。

B

错误。ε-closure 除了后续可达状态,也必须包含起始集合自身的 q0。

C

正确。q0、q1、q2 都属于 ε-closure({q0})。

D

错误。DFA 的一个状态通常对应 NFA 状态的一个子集,不能只取 ε 链末端。

本题为什么容易错

ε 转移不读取输入,但不代表可以忽略。它恰恰决定了“当前可能同时在哪些 NFA 状态”,漏掉任何一个状态都会让后续 move 计算丢失路径。

先看结论

简短答案

子集构造法中,DFA 的初始状态怎么确定,正确答案是 C({q0,q1,q2})。子集构造法首先求 NFA 初始状态的 ε-closure。它包含 q0 本身,也包含从 q0 只经过 ε 转移能够到达的 q1,以及继续从 q1 经 ε 到达的 q2。因此 DFA 初始状态是集合 {q0,q1,q2}。

解析

易混淆概念对比表

概念本题判断区别要点记忆提示
{q0} 本题干扰项 错误。忽略了从 q0 出发不消耗输入即可到达的 q1、q2。 看到该词不要急着选,先判断是否真正解决题干问题
{q1,q2} 本题干扰项 错误。ε-closure 除了后续可达状态,也必须包含起始集合自身的 q0。 看到该词不要急着选,先判断是否真正解决题干问题
{q0,q1,q2} 本题正确答案 正确。q0、q1、q2 都属于 ε-closure({q0})。 看到题干核心场景时优先联想到它
q2 本题干扰项 错误。DFA 的一个状态通常对应 NFA 状态的一个子集,不能只取 ε 链末端。 看到该词不要急着选,先判断是否真正解决题干问题
本题易混淆选项怎么区分
  • {q0}:错误。忽略了从 q0 出发不消耗输入即可到达的 q1、q2。
  • {q1,q2}:错误。ε-closure 除了后续可达状态,也必须包含起始集合自身的 q0。
  • q2:错误。DFA 的一个状态通常对应 NFA 状态的一个子集,不能只取 ε 链末端。
复习

知识点详解

NFA 的同一输入可能有多个后继状态,还可能通过 ε 转移在不消耗输入的情况下改变状态。子集构造法用一个 DFA 状态表示一组 NFA 可能状态。初始集合为 ε-closure({q0})。对 DFA 状态集合 T 和输入符号 a,先计算 move(T,a),再对结果求 ε-closure,得到新的 DFA 状态。只要某个子集中包含 NFA 的接受状态,该 DFA 子集状态就是接受状态。

备考速记

DFA 初态先做 ε 闭包;后续转移先 move,再闭包。

NFA转DFA 在子集构造法场景中的作用

NFA转DFA在本题中的核心价值,是解决“某带 ε 转移的 NFA 初始状态为 q0,且从 q0 可经 ε 转移到 q1,从 q1 又可经 ε 转移到 q2,除此之外没有新的 ε 转移。使用子集构造法转换为 DFA 时,DFA 的初始状态应为()”这个场景问题。复习时不要只背选项名称,还要理解它为什么适用于该场景,以及它能解决哪类安全、流程或管理问题。

拓展

同类题怎么考

  • 根据 ε 转移图求 DFA 初始状态。
  • 给出某个 DFA 状态集合和输入符号,计算下一个状态集合。
  • 判断哪些 DFA 子集状态应为接受状态。
NFA转DFA 在软件设计师软考中的考法

软考选择题通常不会只考概念定义,还会把NFA转DFA放到子集构造法场景中,要求判断它的作用、适用范围或与相近概念的区别。遇到这类题时,先抓住题干中的业务场景,再看哪个选项最能解决该场景下的核心问题。

解题思路

子集构造法的第一张清单要写完整。站在 q0,哪怕一个输入字符都不读,也能沿 ε 路走到 q1、q2,所以 DFA 在读取第一个字符前就可能处于这三个 NFA 状态中的任意一个。DFA 用一个集合把这三种可能性打包起来。

考点定位

带 ε 转移的 NFA 转换为 DFA 时,初始状态为 ε-closure({q0});后续每次状态转移也要先 move,再对结果求 ε-closure。

易错提醒

  • 把 DFA 初态直接写成 NFA 的单个初态 q0。
  • 求 ε-closure 时只走一步,没有继续沿 ε 转移传递闭包。
  • 忘记 ε-closure 必须包含原状态集合本身。

备考提示

  • 每个 DFA 状态都写成花括号集合,避免与原 NFA 单状态混淆。
  • 后续转移固定采用“先 move(T,a),再 ε-closure”的顺序。

你可能还想了解

  • ε-closure 为什么要包含状态本身?
  • NFA 转 DFA 为什么把状态写成集合?
  • 子集构造法中 move 和 ε-closure 的顺序是什么?
  • 转换后的 DFA 哪些状态属于接受状态?

本文小结

DFA 初态应取 NFA 初态的 ε-closure。q0 不读输入即可依次到达 q1、q2,所以 ε-closure({q0})={q0,q1,q2},答案为 C。