在字母{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)是一個至少可追溯。 –