[英]DFA - design a DFA that accepts all strings over {0,1} that contains at most two 00's and three 11's as substring
您將狀態機描述為一幅巨大的圖片,但您可以通過使用結構化名稱命名狀態而不是嘗試繪制巨大的圖表來使問題更容易。
讓你的狀態為(n,m,s),其中n是你看過的00的數量,m是你看過的11s的數量,s是前面的字符讀數(s ='','1', '0')(其中''表示你沒有看到過前一個角色,或者你剛剛找到'00'或'11')。
然后你的過渡是:
(n, m, '') -0-> (n, m, '0')
(n, m, '') -1-> (n, m, '1')
(n, m, '0') -0-> (n+1, m, '')
(n, m, '0') -1-> (n, m, '1')
(n, m, '1') -0-> (n, m, '0')
(n, m, '1') -1-> (n, m+1, '')
n <= 2且m <= 3的所有狀態都在接受。 開始狀態是(0, 0, '')
。
這不是有限的,但您可以通過將所有非接受狀態合並為單個狀態來實現。 它將具有(3 * 4 * 3 + 1)= 37個狀態,這是最小的。
上面的答案假設'000'包含一個'00'而不是2'00'(即'00'的數字是字符串中非重疊'00'的最大數,而'11'則相同) 。 如果你想把'000'算作2,你需要這台機器:
狀態是S(開始)或(n,m,s),其中n,m如前,s是'0'或'1'。 然后:
S -0-> (0, 0, '0')
S -1-> (0, 0, '1')
(n, m, '0') -0-> (n+1, m, '0')
(n, m, '0') -1-> (n, m, '1')
(n, m, '1') -0-> (n, m, '0')
(n, m, '1') -1-> (n, m+1, '1')
所有州都接受,但n> 2或m> 3的州除外。 同樣,我們將所有非接受狀態合並為一個狀態。
這具有(3 * 4 * 2 + 2)= 26個狀態,這又是最小的。
給定正式描述,可以編寫程序來生成描述機器的DOT文件。 這是在答案的第一部分為機器生成圖表的程序。 (注意,它沒有顯示哪些州正在接受,但它們都是FAIL除外)。
def state(n, m, s):
if n > 2 or m > 3: return 'FAIL'
return "n%s_%s_%s" % (n, m, s)
def T(st, c):
n, m, s = st
if s == '':
return (n, m, c)
if s == '0':
return (n+1, m, '') if c=='0' else (n, m, c)
if s == '1':
return (n, m+1, '') if c=='1' else (n, m, c)
print 'digraph {'
for n in xrange(3):
for m in xrange(4):
for s in ['', '0', '1']:
for c in '01':
print ' %s -> %s [label="%s"]' % (state(n, m, s), state(*T((n, m, s), c)), c)
print '}'
好吧,您可以使用單詞來描述自動機,而不是繪制自動機。
我如何解決您的問題:讓頂點成為三元組
定義轉換,啟動狀態和完成狀態非常容易。
所以,有5 * 4 * 3 = 60個州
您可能會注意到有一些不可實現的狀態和某些狀態可能會聯合到“失敗狀態”,這可能會顯着減小自動機的大小
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.