NFA的确定化

NFA的确定化:这里指的 NFA 到 DFA的转换(不包括 ε 自动机),构造一个和 NFA 等价的 DFA。书中有介绍两种确定化的方法(子集法和造表法),这里只介绍造表法,造表法是比子集法简单而有效的一种确定化方法。

1,为什么不用子集法??

在子集法中,如果 NFA 的状态个数 n 比较大,那么,确定化后的 DFA 的状态个数 2^n-1 将更大,其中不少状态是不可达状态。

2,造表法算法的基本思想

把 DFA 中的每一个状态对应 NFA中的一组状态。即由于 NFA 中的 t 是一个多值映射,所以在扫描到某个输入字符后可能达到的状态是集合,而造表法就是用 DFA 的状态记录该状态的集合。

3,造表法实现步骤

1,确定 DFA 的输入字母表(DFA 与 NFA 的输入字母表完全相同);

2,再构建一张表,第一列记为状态子集 I ,对于字母表中的不同符号,在表中单设一列 Ia;

3,表中首行首列位置为 DFA 的开始状态;NFA 的开始状态为 q0,则以 [ q0 ] 作为 DFA 的开始状态,如有多个开始状态,即表示为 [ q0,q1,... q3 ]。多个状态加上“[]”括号即为一个子集元素(对应成 DFA 中的一个状态);

4,根据首行首列的 I ,为字母表中每个输入字符 a 求其 Ia 并记入对应的 Ia 列中;如果此 Ia 不等同于第一列中已存在的所有状态子集 I,则将其顺序列入空行的第一列(Ia 的值为 状态子集 I 中每个元素经过 弧 a 所能到达后继状态的并集并用 “[]”形式表示);

5,重复 4 步骤直至对每个 I 及 a 均已求得 Ia,并且无新的状态子集 Ia 加入第一列时为止;

6,重新命名第一列的每一个状态子集(只要第一列状态子集中包含有原 NFA 终止状态集合中元素的都是新 DFA 的终止状态),形成新的状态转换表,即为与 NFA 等价的 DFA;

4,for example:

NFA:

造表法确定化:

PS:每得到一个新状态,就继续求新状态对于 x,y 的映象,直到再没有新状态出现为止。

确定化后的状态转换表:

PS:[ q0 ],[ q1,q2 ],[ q0,q3 ],[ q1,q2,q3 ],[ q0,q1,q3 ],[ q0,q1,q2,q3 ] 分别标记为 q0`,q1`,q2`,q3`,q4`,q5`。

确定化后的 DFA 状态转换图:

时间: 2024-12-28 07:38:39

NFA的确定化的相关文章

实现一个 DFA 正则表达式引擎 - 3. NFA 的确定化

我们上一节已经将 NFA 构建出来了,我们的 NFAState 对象的结构实际上是这样的: NFAState { private Set<NFAState> directTable; private Map<Character, Set<NFAState>> transitionMap; private int id; } 其中 transitionMap 是该状态接受 Character 后可以转换的状态的映射表. 那么以初始状态 0 为例,我们是不是可以认为状态 0

编译原理——正规式转DFA算法概述

一.概念概述 给定一个单词,判断该单词是否满足我们给定的单词描述规则,需要用到编译原理中词法分析的相关知识,其中涉及到的两个很重要的概念就是正规式(Regular Expression)和有穷自动机(Finite Automata).正规式是描述单词规则的工具,首先要明确的一点是所有单词组成的是一个无穷的集合,而正规式正是描述这种无穷集合的一个工具:有穷自动机则是识别正规式的一个有效的工具,它分为确定的有穷自动机(Deterministic Finite Automata,DFA)和不确定的有穷

非确定的自动机NFA确定化DFA

1.设有 NFA M=( {0,1,2,3}, {a,b},f,0,{3} ),其中 f(0,a)={0,1}  f(0,b)={0}  f(1,b)={2}  f(2,b)={3} 画出状态转换矩阵,状态转换图,并说明该NFA识别的是什么样的语言. 2.NFA 确定化为 DFA 1.解决多值映射:子集法 1). 上述练习1的NFA 2). P64页练习3 2.解决空弧:对初态和所有新状态求ε-闭包 1). 发给大家的图2 2).P50图3.6 原文地址:https://www.cnblogs.

实现一个 DFA 正则表达式引擎 - 4. DFA 的最小化

(正则引擎已完成,Github) 最小化 DFA 是引擎中另外一个略繁琐的点(第一个是构建语法树). 基本思路是,先对 DFA 进行重命名,然后引入一个拒绝态 0,定义所有状态经过非接受字符转到状态 0,0 接受所有字符转换为自身.也就是说我们先建立一个转换表,然后把第一行填写为: state a b c d e f g h ... 0 0 0 0 0 0 0 0 0 0 再之后,我们讲 DFA 的其余状态从 1 开始重命名,填入状态表.代码实现如下: // rename all states

正规式-&gt;最小化DFA说明

  整体的步骤是三步: 一,先把正规式转换为NFA(非确定有穷自动机), 二,在把NFA通过"子集构造法"转化为DFA, 三,在把DFA通过"分割法"进行最小化. 一步很简单,就是反复运用下图的规则,图1 这样就能转换到NFA了. 给出一个例题,来自Google book.本文主要根据这个例题来讲,图2 二.子集构造法. 同样的例题,把转换好的NFA确定化,图3 这个表是从NFA到DFA的时候必须要用到的.第一列第一行I的意思是从NFA的起始节点经过任意个ε所能到达

DFA化简

首先是未化简DFA的转换表 NFA状态 DFA状态 a b {0,1,2,4,7} A B C {1,2,3,4,6,7,8} B B D {1,2,4,5,6,7} C B C {1,2,4,5,6,7,9} D B E {1,2,4,5,6,7,10} E B C 首先根据分为非接受状态组和接受状态组{A,B,C,D}和{E}. 通过输入a来分组,发现第一组无法区分,看输入b的情况,A,B,C都是转到第一组,只有D是转到第二组E,所以这里就可以分出来一组D,现在有3组,{A,B,C},{D}

有穷自动机(NFA、DFA)&amp;正规文法&amp;正规式之间的相互转化构造方法

在编译原理(第三版清华大学出版社出版)中第三章的词法分析中,3.4.3.5.3.6小节中分别讲解了 1.什么是NFA(不确定的有穷自动机)和DFA(确定的有穷自动机) 2.如何将  不确定的有穷自动机(NFA)  转化为  确定的有穷自动机(DFA); 3.如何化简DFA; 4.正规式和有穷自动机的等价性(根据给出的正规式构造有穷自动机); 5.正规文法和有穷自动机的等价性(根据给出的正规式构建有穷自动机): 个人在开始学习这一章节的时候,课上听得有些迷惑,并且看书也是感觉没有头绪,后来花了一些

第九次 DFA化简

1.将DFA最小化:教材P65 第9题 I {1,2,3,4,5} {6,7} {34}b->{6,7} {1,2}b->{2} {5}-> {6}b->{6} {7}b->{6} {6,7}不可区别 II {1,2},{3,4},{5} {6,7} {1}b->{2},{2}b->{2} {3}c->{3},{4}c->{3} {1,2}不可区别,{3,4}不可区别 不可区别 2.构造以下文法相应的最小的DFA S→ 0A|1B A→ 1S|1 B→

WordPress窗体化侧边栏

窗体化侧边栏是一个支持 Widget 的侧边栏或者说是窗体化(widgetized)的侧边栏几乎是 WordPress 主题的标准. 首先,什么是窗体化(widgetizing)呢?简单的说,窗体化就是能够通过拖拉就能够整理侧边栏的模块.比如我们需要更改分类和存档的位置,只需要简单把分类和存档列表拖到它们的位置即可,根本不用去修改侧边栏的代码. 教程地址:http://blog.wpjam.com/m/wp-theme-lesson-6e-widgetizing-sidebar/