在字母{a,b,c}上构建一个DFA,接受具有三个连续相等字母的所有字符串的集合。从字母{a,b,c}构建DFA
因此,它可以接受:AAA,BBB,CCC,AB | BB,caaac,ccbbbcc,aaabbbc ..
我已经尝试了很多不同的方式,这是一个巨大的图我在想,如果有一个更优雅的方式在做这个吗?
在字母{a,b,c}上构建一个DFA,接受具有三个连续相等字母的所有字符串的集合。从字母{a,b,c}构建DFA
因此,它可以接受:AAA,BBB,CCC,AB | BB,caaac,ccbbbcc,aaabbbc ..
我已经尝试了很多不同的方式,这是一个巨大的图我在想,如果有一个更优雅的方式在做这个吗?
首先,您的标题说NFA,但您的问题的正文说DFA。我将回答两种方式来说明为什么这很重要。
首先考虑NFA。我们只想接受具有三个相同类型的连续符号的字符串。有三个符号,所以有三种方法可能发生(假设我们认识到字符串将在第一次出现三个连续符号后被接受)。我们可以看到任何东西,然后是三个相同的符号,然后再一次。一个NFA很容易写下来:
__
/\ __
|/a,b,c /\
V/ |/a,b,c
--->q0--a->q1-a->q4-a-\ V/
| \-b->q2-b->q5-b-->(q7)
\---c->q3-c->q6-c-/
我们国家做到以下几点:
读取输入字符串的一些前缀后,NFA非确定性分支检查输入字符串是否包含AAA,BBB或CCC,如果确实如此,进入Q7和接受任何可能留在后缀。
为了得到一个DFA,确实是一个最小的DFA,我推荐按照Myhill-Nerode定理进行操作,按字典顺序检查字符串,看看它们是否可以与我们已经考虑的字符串区分开来,然后设计我们的DFA一个状态一次。
因为我们跑出区分字符串,我们知道我们列出了所有必需的状态为一个最小DFA,我们可以写下答案:
+---a--->[a]<---a----+
| +-c--->[c]<---c-+ |
| | | |
+----b--->[b]-------b------>[bb]---b----+
| |
| +---b--->[b]<---b----+ | +--+
| | +-c--->[c]<---c-+ | | | a,b,c
| | | | | V V |
--->[e]---a--->[a]-------a------>[aa]---a--->[aaa]--+
| ^
| +---a--->[a]<---a----+ |
| | +-b--->[b]<---b-+ | |
| | | | | |
+----c--->[c]-------c------>[cc]---c----+
(各州[A],[b]和[c]每个重复两次,以使图更漂亮他状态转换图不是平面的,而且根本就不会渲染,更不用说ASCII艺术了)。
请注意,它具有与我们记录的简单NFA相同的状态数量 - 这恰好消除了非确定性。
我不明白你是如何工作的--a,C - >,--- b,c - >,--- a,b - > – Dictatorboy
@DictatorBoy这些转换处理的情况下,您开始看到a,b或c's,但随后看到了其他东西,必须“开始过度”。正如我在括号中注意到的,我重复了状态[a],[b]和[c]使图更加整洁,但重复(不转换)表示真实状态(转换出)。 – Patrick87
是啊,这是很难做出整齐,但是这点[图](https://www.planttext.com/?text=TP9D3e8m48NtFSK4j_K41iFEGnWNRqgZHY04S4Muksq56ihGvVT-Cfssw0TqmxUkLFb-TcXVTADHANB7qlbAe7i5jbMU8Ni4Z8053iTRzFr6YKsySfuJ7B30EMtYJPDPkPaJ9c21cxJ9B4sUxWRMh5S3vA4XJu0Zk-2FbzzlaULwFh8B_hYHlTyaKyP57VZJmD8_TcW-UO_QNiXEwfGoQ69DHbAyv3Kd2YdWZrE9VKgMZ5pcdtPIQY9LsAPqN_m7)是一个至少可追溯。 –