编程语言
首页 > 编程语言> > NFA转DFA的子集构造(Subset Construction)算法详解

NFA转DFA的子集构造(Subset Construction)算法详解

作者:互联网

目录

@(NFA转DFA的子集构造Subset Construction算法)

之前学习编译原理的时候老师有讲过子集构造法,当时我以为自己听懂了,信心满满。可是这两天我做了一些题目,发现自己实际上还是太嫩了,学习浮于表面。之后又重新看了龙书和虎书,对子集构造法有了更深层次的了解。特此发出一篇文章分享我的经验。

1 概念

概念是我们学习编译原理的重中之重,虽然他很晦涩难懂,但我有必要将其放在最开始。

1.1 虎书概念

虎书的概念更偏向于理论化,我当时看的时候一头雾水,但是不要担心,之后会一点一点解释的

首先,我们形式化定义\(\epsilon\)闭包如下:

现在,假设我们位于由NFA状态\(s_i,s_k,s_l\)组成的集合\(d= \lbrace s_i,s_k,s_l \rbrace\)中。从\(d\)中的状态出发,输入符号\(c\),将到达NFA新的状态集;我们称这个状态集为\(DFAedge(d,c)\):

利用\(DFAedge\)能更形式化地写出NFA模拟算法。如果初态是\(s_1\),输入字符串是\(c_1,...,c_k\),则算法为:

有了\(closure\)和\(DFAedge\)算法,就能构造出DFADFA的状态\(d_1\)就是\(closure(s_1)\)。抽象而言,如果\(d_j=DFAedge(d_i,c)\)则存在一条从 \(d_i\) 到 \(d_j\) 的标记为 \(c\) 的边。令 \(\Sigma\) 是字母表:

1.2 龙书概念

个人认为龙书的概念更加通俗易懂,但是由于没有数学公式的归纳,导致理论基础不扎实,有点慌。所以推荐两本书一起看。

首先,是概念:

接着,是算法:

操作 描述
\(\epsilon - closure(s)\) 能够从NFA状态\(s\)开始只通过\(\epsilon\)转换到达的NFA状态集合
\(\epsilon - closure(T)\) 能够从\(T\)中某个NFA状态\(s\)开始只通过\(\epsilon\)转换到达的NFA状态集合,即 \(\bigcup_{s \in T} \epsilon -closure(s)\)
\(move(T,a)\) 能够从 \(T\) 中某个状态 \(s\) 出发通过标号为 \(a\) 的转换到达的NFA状态的集合

2 举个例子解释

解释一下:由此可知,\(A\)通过\(a\),连到\(B\),以此类推。就可以做出DFA图了^_^在这里插入图片描述

3 如何最小化DFA的状态数量

很简单,如果开始于\(s_1\)的机器接收字符串\(\sigma\),始于\(s_2\)的和始于与\(s_1\)接收的串相同并到达相同状态,且两个状态集同为终态或者非终态,那么\(s_1,s_2\)是等价的。我们可以把指向\(s_2\)的连线全部指向\(s_1\),并删除\(s_2\),反之亦然。

4 总结

NFADFA知识总结就到这里,有什么问题请留言,有错误请批评指正,非常感谢您的阅读。

标签:Subset,closure,rbrace,NFA,状态,epsilon,Construction,qquad
来源: https://www.cnblogs.com/Zzzcode/p/10843983.html