为给定的正则表达式绘制最小 DFA
Posted
技术标签:
【中文标题】为给定的正则表达式绘制最小 DFA【英文标题】:drawing minmal DFA for the given regular expression 【发布时间】:2012-11-26 02:05:59 【问题描述】:绘制最小DFA
的直接简单方法是什么,它接受与给定Regular Expression(RE)
相同的语言。
我知道可以通过以下方式完成:
Regex ---to----► NFA ---to-----► DFA ---to-----► minimized DFA
但是有什么捷径吗?喜欢(a+b)*ab
【问题讨论】:
我认为没有捷径。 我认为在 AHO、SETHI 和 ULLMAN 的“编译器:原理、技术和工具”中提到了一些算法。作者编写了一种直接从正则表达式构造 dfa 的技术”。但我无法理解。 @NirajRana 给我链接..你在谈论哪个主题 【参考方案1】:DFA 的正则表达式
虽然没有从正则表达式 (RE) 绘制 DFA 的算法捷径,但通过分析而不是推导可以使用捷径技术,它可以节省您绘制最小化 dfa 的时间。但是偏离了你只能通过练习才能学习的技术。我以你的例子来展示我的方法:
(a + b)*ab
首先,考虑正则表达式的语言。如果第一次尝试很难说出语言描述是什么,那么找到可以用语言生成的最小可能字符串,然后找到第二小的......
记住一些基本正则表达式的解决方案。例如,我有written here some basic idea to writing left-linear and right-linear grammars directly from regular expression. 同样你可以写来解释最小化的 dfa。
在 RE (a + b)*ab
中,可能的最小字符串是 ab
,因为使用 (a + b)*
可以生成 NULL(^)
字符串。第二小的字符串可以是aab
或bab
。现在我们可以很容易地注意到关于语言的一件事是,该 RE 语言中的任何字符串总是以ab
(后缀)结尾,而前缀可以是任何可能的字符串,由a
和b
组成,包括^
。
另外,如果当前符号是a
;那么一个可能的机会是下一个符号将是b
和字符串结尾。因此,在 dfa 中,我们需要一个转换,使得当 b
符号出现在 符号 a
之后,那么它应该移动到某些 最终状态 dfa。
接下来,如果一个新符号进入最终状态,那么我们应该移动到某个非最终状态,因为b
之后的任何符号都可能只在语言中的某个字符串中间,就像所有语言一样字符串以后缀 'ab'
结尾。
所以在这个阶段有了这些知识,我们可以绘制一个不完整的转换图,如下所示:
---►(Q0)---a---►(Q1)---b----►((Qf))
现在你需要明白:每个状态都有一些含义,例如
(Q0) 表示 = 开始状态 (Q1) 表示 = 最后一个符号是“a”,再加上一个“b”,我们可以转换到最终状态 (Qf) 表示 = 最后两个符号是 'ab'
现在想想如果符号a
进入最终状态会发生什么。更多地说明 Q1 因为这个状态意味着最后一个符号是a
。 (更新转换图)
--►(Q0)---a---►(Q1)---b----►((Qf))
▲-----a--------|
但假设符号 a
不是符号 b
到达最终状态。然后我们应该从最终状态转移到某个非最终状态。在这种情况下的当前转换图中,我们应该从最终状态 Qf 移动到初始状态。(同样我们需要字符串中的ab
来接受) p>
--►(Q0)---a---►(Q1)---b----►((Qf))
▲ ▲-----a--------|
|----------------b--------|
这张图还不完整!因为来自 Q1 的符号 a
没有出边。对于状态 Q1 上的符号 a
,需要自循环,因为 Q1 表示最后一个符号是 a
。
a-
||
▼|
--►(Q0)---a---►(Q1)---b----►((Qf))
▲ ▲-----a--------|
|----------------b--------|
现在我相信上图中的 Q1 和 Qf 都存在所有可能的出边。一个缺失的边是符号 b
的 Q0 的出边。并且在状态 Q0 必须有一个自循环,因为我们再次需要一个 ab
序列,以便字符串可以被接受。 (ab
可以实现从 Q0 到 Qf 的转换)
b- a-
|| ||
▼| ▼|
--►(Q0)---a---►(Q1)---b----►((Qf))
▲ ▲-----a--------|
|----------------b--------|
现在 DFA 已完成!
在最初的几次尝试中,该方法可能看起来很困难。但是,如果你学会用这种方式画画,你会发现你的分析能力有所提高。你会发现这种方法是快速而客观的绘制 DFA 的方法。
* 在我给出的链接中,我描述了更多的正则表达式,我强烈建议你学习它们并尝试为这些正则表达式制作 DFA。
【讨论】:
在my answer 的 EDIT 部分查找更多示例我使用相同的技术进行绘制。 Grijesh bhai 我需要你的帮助。给我推荐一本关于自动机理论的好书。 @hacks Peter Linz比较简单的一本书,适合学生阅读 An Introduction To Formal Languages And Automata @hacks "Ullman & Hopcraft" 很难读懂。 “K.L.P Mishra”还可以,不多解释,貌似是数学家写的。我认为计算机科学专业的学生会喜欢“Peter Linz”。顺便说一句,我读了所有 3 个。Video lectures以上是关于为给定的正则表达式绘制最小 DFA的主要内容,如果未能解决你的问题,请参考以下文章