正规文法、正规式、确定的有穷自动机DFA、不确定的有穷自动机NFA 的概念、区分以及等价性转换【我直接拿下!】

本文主要是介绍正规文法、正规式、确定的有穷自动机DFA、不确定的有穷自动机NFA 的概念、区分以及等价性转换【我直接拿下!】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

      • 正规文法
      • 正规式
      • 有穷自动机
        • 确定的有穷自动机——DFA
        • 不确定的有穷自动机——NFA
        • DFA 与 NFA 的区分
      • 正规式转换为正规文法
      • 正规文法转换为正规式
      • NFA 转换为 DFA
        • NFA 最小化
      • NFA 转换为正规式
      • 正规式转换为 NFA
      • 正规文法转换为 NFA
      • NFA 转换为正规文法

前言:

在学习正规文法之前,需要先了解一下什么是文法,具体可以查看这篇文章,总结的比较好 —— 编译原理–四种文法的理解

正规文法

设有 G=(VN,VT,P,S),若 P 中的每一个产生式的形式都是 A ——> aBA——>a,其中 AB 都是非终结符,a 属于 VT*,则称 G3 型文法,又称正规文法。

正规式

正规式也称正则表达式,也是表示正规集的工具。是一种用于匹配文本模式的字符序列。由普通字符(如字母、数字)和特殊字符(如元字符)组成的表达式。

在正规式中,常见的元字符包括:

  • 通配符(如 . 表示匹配任意字符)

  • 字符类(如 [0-9] 表示匹配数字 09 之间的任意一个字符)

  • 量词(如 * 表示匹配前面的字符 0 次或多次)

  • 锚点(如 ^ 表示匹配字符串的开头、$ 表示匹配字符串的结尾)

有穷自动机

有穷自动机(Finite State Machine,FSM)是一种抽象的识别装置,用于描述具有有限个状态并在输入序列驱动下进行状态转换的系统,能准确地识别正规集。

一个有穷自动机由以下几个要素组成:

1. 状态集合(States): 有穷自动机的所有可能状态的集合。每个状态代表系统的某种特定情况或条件。

2. 输入字母表(Input Alphabet): 有穷自动机接受的输入符号的集合。例如,二进制数的有穷自动机的输入字母表可以是{0, 1}。

3. 转移函数(Transition Function): 描述从一个状态到另一个状态的转移规则。该函数接受当前状态和输入符号,并返回下一个状态。转移函数可以用图形表示,其中状态是节点,输入符号是边。

4. 初始状态(Initial State): 有穷自动机开始运行时的起始状态。

5. 终止状态(Accepting States): 有穷自动机在运行过程中达到的特殊状态。当有穷自动机达到终止状态时,它可以接受或拒绝输入序列。

有穷自动机分为确定性有穷自动机(Deterministic Finite Automaton,DFA)和非确定性有穷自动机(Nondeterministic Finite Automaton,NFA)。

在确定性有穷自动机(DFA)中,每个状态都有唯一的转移路径,而在非确定性有穷自动机(NFA)中,一个状态可以有多个转移路径。

确定的有穷自动机——DFA

一个确定的有穷自动机 DFA 由一个五元组组成,可以用以下公式表示:

M = (K, Σ, f, S, Z)

其中:

  • K 表示一个有穷集,它的每个元素称为一个状态。

  • Σ 表示有穷字母表,Σ = {a₁, a₂, ..., aₘ},每个字母代表有穷自动机接受的输入符号,也成为输入符号表。

  • f 表示转移函数,K × Σ → K,它描述从一个状态到另一个状态的转移规则。对于给定的状态 Kᵢ 和输入符号 a,则经过 f 转换函数后,会返回下一个状态 Kⱼ,转换规则如:f(Kᵢ,a) = Kⱼ

  • S 表示初态集,S ∈ K,它是唯一的一个初态。

  • Z 表示终态集,Z ⊆ K,当有穷自动机达到终止状态时,它可以接受或拒绝输入序列,也称为可接受状态或结束状态。

不确定的有穷自动机——NFA

一个不确定的有穷自动机 NFA 同样也是由一个五元组组成,可以用以下公式表示:

M = (K, Σ, f, S, Z)

其中:

  • K 表示一个有穷集,它的每个元素称为一个状态。

  • Σ 表示有穷字母表,Σ = {a₁, a₂, ..., aₘ},每个字母代表有穷自动机接受的输入符号,也成为输入符号表。

  • f 表示转移函数,K × Σ* → K,表示 K 的全体子集的映像,即 K × Σ* → 2K,其中 2K 表示 K 的幂集。

  • S 表示初态集,S ⊆ K,表示一个非空初态集。

  • Z 表示终态集,Z ⊆ K,表示一个终态集。

当有穷字母表 Σ 中存在 ε 空串时,那么该有穷自动机为 NFA。

DFA 与 NFA 的区分

DFA 和 NFA 的主要区别在于它们的转移函数和转移规则:

转移函数不同

DFA 的转移函数是唯一的,即每个状态和输入符号只对应唯一的下一个状态(同一路径中输入符号必须唯一)。

NFA 的转移函数可以有多个下一个状态,也就是说一个状态可以按照多种选择进行转移。


转移规则不同

DFA 的转移规则相对简单,每个状态在接收到输入符号后只能转移到唯一的下一个状态,从而形成确定的转移路径。

NFA 的转移规则更加复杂,一个状态可以按照多种选择进行转移,从而形成多条可能的转移路径。


因此,DFA 模型的缺点是其在某些情况下需要更多的状态来表示相同的语言,并且难以处理一些复杂的语言。然而,DFA 的优势在于其转移函数和转移规则都明确,因此可以直接实现,易于编程实现和模拟执行。

正规式转换为正规文法

在开始转换之前,我们先来了解一下正规式转换正规文法的公式,一共有三个,如下所示:

当存在正规式产生式 A → xy,则有正规文法:

A → xB
B →   y

当存在正规式产生式 A → x*y,则有正规文法:

A → xB
A →   y
B → xB
B →   y

当存在正规式产生式 A → x|y,则有正规文法

A   →   x
B   →   y

转换示例:

将正规式 r = a(a|d)* 转换为相应的正规文法,转换过程如下所示:

正规文法转换为正规式

正规文法转换为正规式同样有三个公式,如下所示:

当存在正规文法 A → xBB → y,则有正规式 A = xy

当存在正规文法 A → xA|y,则有正规式 A = x*y

当存在正规文法 A → xB → y,则有正规式 A = x|y


转换示例:

现有文法 G[S],其所有产生式如下所示:

S → aA
S →    a
A → aA
A → dA
A →    a
A →    d

将文法 G[S] 转换为正规式:

NFA 转换为 DFA

这里先来了解将 NFA 转化为接受同样语言的 DFA 的算法,称为子集法

子集法是一种用于将不确定的有穷自动机(NFA)转换为具有等价性的确定的有穷自动机(DFA)的算法。

在子集法中,我们将每个 DFA 状态表示为 NFA 状态的子集。具体步骤如下:

  1. 创建 DFA 的初始状态。这个初始状态是由 NFA 的初始状态以及通过 ε转移可以到达的其他状态组成的子集。可以表达为 ε-closure(I),其中 I 为初态,也就是求从初态 I 开始,经过 ε 所到达的状态形成的闭包集合。

  2. 对于新创建的 DFA 状态,遍历每个输入符号(除去 ε 空串)。对于每个输入符号,找出从当前 DFA 状态中的任意一个 NFA 状态通过该输入符号可以达到的所有 NFA 状态,并将它们作为新的 DFA 状态的部分。可以表示为 move(I,a),从初态 I 开始,经过 a 弧所到达状态。

重复第 2 步,直到无法再创建新的 DFA 状态为止。最终得到的每个 DFA 状态都与 NFA 的某个状态集合相对应。

转换示例:

将给出的 NFA-N 状态图,转换为等价的 DFA。

NFA 最小化

在进行最小化(简化)前,需要先进行多余状态检查。检查从该自动机的开始状态出发,任何输入串也不能到达的那个状态,或者从这个状态没有通路到达终态。

在确定有限自动机(DFA)中,最小化是指将给定的 DFA 转换为等价且具有最少状态数量的 DFA。

最小化的目的是简化自动机的结构,减少状态数量,从而提高处理效率和性能。

下面是最小化 DFA 的一种常见方法,称为 Hopcroft 算法:

1.初始化分区: 将 DFA 的状态划分为两个初始分区,即接受状态(终态)和非接受状态(非终态)。

2.对于每个划分:

  • a. 对于每个输入符号,检查该划分中的状态在该输入符号下是否具有相同的转移目标。如果不是,则根据该输入符号将状态进行划分。

  • b. 如果对于某个输入符号的划分发生了变化,重新开始对所有划分进行遍历。

重复步骤 2,直到没有新的划分发生,最终得到的划分即为最小化 DFA 的状态集合。

在 Hopcroft 算法中,通过不断比较状态的转移目标,将具有相同转移目标的状态划分在同一个分区。这样可以逐步减少分区的数量,直至无法再进行划分为止。

最小化示例

对上方转换的 DFA 状态图进行最小化处理。

NFA 转换为正规式

将 NFA 转换为具有等价性的正规式公式如下:

转换示例:

正规式转换为 NFA

将正规式转换为具有等价性的 NFA 公式如下:

转换示例:

正规文法转换为 NFA

将正规文法转换为具有等价性的 NFA 十分简单,只需要根据正规文法产生式一步步描述出来即可,但是需要增加一个终态产生式

假设当前存在正规文法 G[S]:S—>aA A—>b,转换为等价性的 NFA 过程如下所示:

转换示例:

将正规文法 G[S] 转换为具有等价性的 NFA。

NFA 转换为正规文法

将 NFA 转换为正规文法同样简单,根据状态图直接可以的出结果,但是需要注意结果的格式书写。

正规文法结果由四部分组成,分别为:有穷集 K、有穷字母表 Σ、产生式 P 以及初态组成。

转换示例:

将下图所示的 NFA 转换为具有等价性的正规文法。




希望这篇文章对你有所帮助。

这篇关于正规文法、正规式、确定的有穷自动机DFA、不确定的有穷自动机NFA 的概念、区分以及等价性转换【我直接拿下!】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/264250

相关文章

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方

redis-sentinel基础概念及部署流程

《redis-sentinel基础概念及部署流程》RedisSentinel是Redis的高可用解决方案,通过监控主从节点、自动故障转移、通知机制及配置提供,实现集群故障恢复与服务持续可用,核心组件包... 目录一. 引言二. 核心功能三. 核心组件四. 故障转移流程五. 服务部署六. sentinel部署

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

一文带你迅速搞懂路由器/交换机/光猫三者概念区别

《一文带你迅速搞懂路由器/交换机/光猫三者概念区别》讨论网络设备时,常提及路由器、交换机及光猫等词汇,日常生活、工作中,这些设备至关重要,居家上网、企业内部沟通乃至互联网冲浪皆无法脱离其影响力,本文将... 当谈论网络设备时,我们常常会听到路由器、交换机和光猫这几个名词。它们是构建现代网络基础设施的关键组成

Python进行JSON和Excel文件转换处理指南

《Python进行JSON和Excel文件转换处理指南》在数据交换与系统集成中,JSON与Excel是两种极为常见的数据格式,本文将介绍如何使用Python实现将JSON转换为格式化的Excel文件,... 目录将 jsON 导入为格式化 Excel将 Excel 导出为结构化 JSON处理嵌套 JSON:

Kotlin Map映射转换问题小结

《KotlinMap映射转换问题小结》文章介绍了Kotlin集合转换的多种方法,包括map(一对一转换)、mapIndexed(带索引)、mapNotNull(过滤null)、mapKeys/map... 目录Kotlin 集合转换:map、mapIndexed、mapNotNull、mapKeys、map

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

利用Python脚本实现批量将图片转换为WebP格式

《利用Python脚本实现批量将图片转换为WebP格式》Python语言的简洁语法和库支持使其成为图像处理的理想选择,本文将介绍如何利用Python实现批量将图片转换为WebP格式的脚本,WebP作为... 目录简介1. python在图像处理中的应用2. WebP格式的原理和优势2.1 WebP格式与传统