概念
最小化:優化DFA,使其狀態數最少。
那麼什麼時候狀態數是最少的呢?這裏我們需要介紹兩個新的名詞:可區分和不可區分。
官方定義:
可區分:對於任何兩個狀態t和s,若從一狀態出發接受輸入字符串ω,而從另一狀態出發不接受ω,或者從t出發和從s出發到達不同的接受狀態,則稱ω對狀態t和s是可區分的。
不可區分:設想任何輸入序列ω對s和t均是不可區分的,則說明從s出發和從t出發,分析任何輸入序列ω均得到相同結果。因此,s和t可以合併成一個狀態
通俗一點的來說,可區分狀態可以理解爲兩個(或多個)狀態根本不是一類,根據下一個輸入的符號,不同狀態得到的結果可能會出現不同。而不可區分狀態就是,這兩個(或多個)狀態,無論下一個接收的符號是什麼,得到的結果都是一樣的。【定義理解不懂的,可以參考後面的例子思考,應該會容易一點點】
綜上所述,DFA的最小化就是找出DFA中所有的不可區分狀態,把它們合併爲一個狀態,這樣可以簡化DFA的狀態數,顯得更加簡潔。
舉例說明
下圖是一個沒有最小化的DFA
現在我們對其進行最小化,那麼怎麼辦呢?這裏一般不好一步到位,需要我們慢慢測試【多試試就可以了】。
首先從上面的方法可以看出,我們先加上ABC爲一類,D是一類。然後測試ABC是可區分還是不可區分的。
- ABC接收a,到達的狀態都是B
- ABC接收b,到達的狀態是C、D。其中AC接收b到達C,B接收b到達D。
從上的分析可以看出,ABC不是同一類的,屬於可區分,因爲在接收b的時候,出現了分歧。
然後再加上AC是一類,B單獨一類,D單獨一類。
- AC接收a,到達的狀態都是B
- AC接收b,到達的狀態都是C
從上面的分析我們可以發現,AC是一類,不可區分,因爲無論輸入a,還是b,它們最終到達的狀態都是一樣的,所以我們可以說它們是不可區分的。在最小化DFA中,AC是可以合併爲一個狀態的。
所以最後的最小化DFA就是:
注:解題沒有固定的格式,需要憑藉自己的理解去猜測,測試到底哪一組是不可區分。慢慢練習,自然就會熟悉的。