当前位置: 首页 > news >正文

【程序语言与编译】 有限自动机(DFA与NFA)

适合读者:软考中级备考同学
阅读时间:3.5分钟
内容:DFA与NFA的定义、区别、等价转换、例题


1. 什么是有限自动机?

有限自动机(Finite Automaton, FA)是一种识别器,用于判断一个输入字符串是否属于某正规集。它是词法分析的核心工具,也是软考中常考的内容。

有限自动机分为两类:

  • 确定型有限自动机(DFA,Deterministic Finite Automaton)
  • 非确定型有限自动机(NFA,Nondeterministic Finite Automaton)

二者识别能力等价(任何NFA都可以转换为等价的DFA),但DFA更适合实际实现,NFA更方便人工构造。


2. DFA(确定型有限自动机)

2.1 形式定义

DFA是一个五元组:

M=(Q,Σ,δ,q0,F)M = (Q, \Sigma, \delta, q_0, F)M=(Q,Σ,δ,q0,F)

其中:

  • QQQ:有限的状态集合
  • Σ\SigmaΣ:有限的输入字母表
  • δ\deltaδ确定的转移函数,δ:Q×Σ→Q\delta: Q \times \Sigma \rightarrow Qδ:Q×ΣQ(每个状态和输入符号唯一确定下一个状态)
  • q0q_0q0:初始状态,q0∈Qq_0 \in Qq0Q
  • FFF:终止状态集合,F⊆QF \subseteq QFQ

2.2 特点

  • 对于当前状态和输入符号,有且只有一个下一状态。
  • 状态转移图中,每个结点的出边在相同输入符号上最多一条。
  • 实现简单,模拟运行速度快。

2.3 示例

DFA识别所有以01结尾的二进制串:

状态转移表:

状态输入0输入1
AAB
BCB
CAB

初始状态AAA,终止状态CCC


3. NFA(非确定型有限自动机)

3.1 形式定义

NFA同样是一个五元组:

M=(Q,Σ,δ,q0,F)M = (Q, \Sigma, \delta, q_0, F)M=(Q,Σ,δ,q0,F)

区别在于转移函数δ\deltaδQ×(Σ∪{ε})→2QQ \times (\Sigma \cup \{\varepsilon\}) \rightarrow 2^QQ×(Σ{ε})2Q(映射到状态集合的子集,而不是单个状态)。

3.2 特点

  • 从当前状态读入一个符号后,可能进入多个下一状态(不确定性)。
  • 允许ε\varepsilonε转移(不读入任何符号即可跳转)。
  • 只要存在一条路径能到达终止状态,NFA就接受该输入串。

3.3 示例

NFA识别以01结尾的串(比DFA更简洁):

状态图:A→0AA \xrightarrow{0} AA0AA→1AA \xrightarrow{1} AA1AA→0BA \xrightarrow{0} BA0BB→1CB \xrightarrow{1} CB1C(C为终止)。注意从A读0既可以留在A也可以到B,这是非确定性。


4. DFA与NFA对比表

对比项DFANFA
下一状态唯一多个或零个
ε\varepsilonε转移不允许允许
状态数较多较少(通常)
构造难度较难(手动)容易(直观)
模拟运行快(无回溯)慢(需回溯或子集构造)
识别能力相同相同(等价)

5. NFA转DFA(子集构造法)

核心思想:将NFA的一个状态子集看作DFA的一个状态。

算法步骤

  1. 从初始状态出发,求其ε\varepsilonε闭包(即通过任意步ε\varepsilonε转移能到达的所有状态集合),作为DFA的初始状态。
  2. 对每个DFA状态(即一个NFA状态集),对于每个输入符号aaa,计算该状态集中所有状态读入aaa后能到达的状态的ε\varepsilonε闭包,得到新的状态子集。若新子集未出现过,则添加到DFA中。
  3. 重复直到没有新状态产生。
  4. 若某个DFA状态包含至少一个NFA的终止状态,则该DFA状态为终止状态。

简例(NFA见3.3示例):

  • 初始状态集{A}\{A\}{A}ε\varepsilonε闭包还是{A}\{A\}{A}
  • 读0:从A出发,0可到A和B →{A,B}\{A,B\}{A,B}闭包(无ε\varepsilonε)→{A,B}\{A,B\}{A,B}
  • 读1:从A出发,1可到A →{A}\{A\}{A}
  • 对新状态{A,B}\{A,B\}{A,B},读0:从A到A,B,从B无0转移 →{A,B}\{A,B\}{A,B};读1:从A到A,从B到C →{A,C}\{A,C\}{A,C}
  • {A,C}\{A,C\}{A,C}读0:从A到A,B,C无0 →{A,B}\{A,B\}{A,B};读1:从A到A,C无1 →{A}\{A\}{A}
  • 最终DFA包含状态{A}\{A\}{A}(初始),{A,B}\{A,B\}{A,B}{A,C}\{A,C\}{A,C}(终止)。可重命名。

6. 经典例题

题目1:已知NFA的状态转换图如下(文字描述):状态A初始,A读0可到A和B,A读1到A;B读1到C;C无转移。求该NFA对应的DFA。

(解即为5中的示例,答案为DFA状态集和转移。)

题目2:以下关于DFA和NFA的描述,正确的是( )。
A. NFA的识别能力比DFA强
B. DFA不允许ε\varepsilonε转移
C. 每个NFA都可以转换为等价的DFA
D. DFA的状态数一定小于NFA

答案:B和C(A错,能力等价;D错,DFA状态数可能指数增长)


题目3:给定DFA,初始状态0,终止状态2,转移:0读a到1,0读b到0;1读a到2,1读b到1;2读a到2,2读b到2。判断字符串aaba是否被接受。

:从0开始:a→1;a→2;b→2;a→2。最终在状态2(终止),接受。
答案:接受


7. 记忆口诀

DFA确定唯一路,NFA多路可空跳。
子集构造换等价,识别能力一样高。


8. 给备考同学的一句话

有限自动机是词法分析的数学模型。软考中常见:

  • 给定状态图或转移表,判断DFA/NFA类型。
  • NFA转DFA(子集构造法,只需理解概念,很少要求完整手工计算复杂例子)。
  • 模拟DFA运行,判断字符串是否被接受。

记住:DFA实现简单,NFA构造方便,二者等价。理解子集构造法的思想,考试时遇到相关选择题就能应对。


🔔本专栏日更2篇,点击头像 → 专栏《软考中级高频考点》订阅

#软考中级 #软件设计师 #有限自动机 #DFA #NFA #词法分析

http://www.jsqmd.com/news/995587/

相关文章:

  • 手把手教你用Python脚本调试ZDT_Emm42_V5.0步进电机驱动器(Modbus-RTU协议)
  • MC9S08SH8 TPM模块深度解析:从输入捕获到PWM的实战指南
  • 保姆级教程:用STM32 HAL库驱动W25N01GV Nand Flash(含ECC校验与坏块管理思路)
  • 超星学习通自动签到终极指南:告别繁琐手动操作
  • 突破性音乐自由方案:一站式解锁全网高品质无损音乐体验
  • 终极便携C/C++开发工具包:5分钟搭建Windows专业开发环境
  • AI动态简报之算力基建篇(2026.06.11)
  • 揭秘20KV脉冲电弧:磁场下的形态之谜与直流/交流放电辨析
  • 优质后塍办理公司注销业务企业排名前十哪家强 - 品牌排行榜
  • Redis 从入门到精通:持久化RDB 与 AOF
  • 关于C语言中getchar()的详细使用
  • 别再问怎么连PLC了!手把手教你用Python+SMLP协议读写三菱FX5U数据
  • 嵌入式设计核心:外设电气规格深度解析与工程实践指南
  • 神经网络控制器的特洛伊木马攻击与防御实践
  • 用Qt和RKNN在飞凌OK3568上搞个USB摄像头实时AI识别(附完整代码和避坑指南)
  • 2026 贵阳五大犬舍专业测评:伴西西登顶,综合实力断层领先 - 同城宠物优选基地
  • 24小时健身加盟选哪个品牌更合适 - 品牌排行榜
  • 吃透二叉树与递归!60分钟掌握树结构核心+解题思路
  • 2026论文双降终极榜单:10款降AI率工具, 合规修正一路顺畅
  • 2026年绵阳高空作业车出租市场观察:服务能力与项目实绩的多维分析 - 优质品牌商家
  • C语言项目实战:用uthash给你的自定义数据结构加个‘高速缓存’
  • 3分钟完成Windows 11系统优化:免费开源工具终极指南
  • 2026 泉州犬舍 TOP5 权威榜单,伴西西断层领跑,以标准化体系重塑行业标杆 - 同城宠物优选基地
  • P89LPC912/913/914实战:SPI、模拟比较器与看门狗配置避坑指南
  • 2026年河南工科类大学与应急电力服务商深度观察:安阳工学院及行业伙伴全景测评 - 优质品牌商家
  • 别再死记硬背了!用Python+NumPy手把手带你理解卷积码的编码过程(附代码)
  • 2026年成都蜀绣与蜀锦品牌深度解析:工坊实力、产品线与行业趋势全测评 - 优质品牌商家
  • Dexterity-BEV:跨本体跨相机Action三维空间对齐,推动通用机器人策略学习
  • AI 辅助的设计系统主题扩展:从品牌色到完整配色方案的智能推导
  • 汽车级LCD驱动芯片PCA85262:从原理到实战的嵌入式显示方案