簡體   English   中英

DFA 中的最小狀態數

[英]Minimum number of states in DFA

DFA 中接受字符串(基數為 3,即三元形式)中與 5 模 6 一致的最小數狀態?

我試過了,但做不到。

乍一看,它似乎有 6 個狀態,但可以進一步最小化。
我們先來看看狀態轉移表: 狀態轉換表

這里,狀態 q 0 , q 1 , q 2 ,...., q 5 分別對應於模 0,1,2,..., 5 除以 6 時的狀態。 q 0是我們的初始狀態,由於我們需要模 5,因此我們的最終狀態將是 q 5

從上面的狀態轉換表中得出的一些觀察結果:

  • 狀態 q 0 , q 2和 q 4完全相同
  • 狀態 q 1 , q 3和 q 5完全相同

在相同輸入上轉換到相同狀態的狀態可以合並為單個狀態。

注意:最終狀態和非最終狀態永遠不能合並。

因此,我們可以將 q 0 , q 2 , q 4合並在一起,將 q 1 , q 3合並在一起,使狀態 q 5遠離整理。
最終的最小 DFA 有 3 個狀態,如下所示 最小 DFA

讓我們看一下語言中的幾個字符串:

 12 =              1*3 + 2 =  5 ~ 5 (mod 6)
102 =        1*9 + 0*3 + 2 = 11 ~ 5 (mod 6)
122 =        1*9 + 2*3 + 2 = 17 ~ 5 (mod 6)
212 =        2*9 + 1*3 + 2 = 23 ~ 5 (mod 6)

1002 = 1*18 + 0*9 + 0*9 + 2 = 29 ~ 5 (mod 6)

我們注意到所有的字符串都以 2 結尾。這是有道理的,因為 6 是 3 的倍數,從 3 的倍數得到 5 的唯一方法是加上 2。基於此,我們可以嘗試解決字符串的問題與 3 模 6 一致:

  10 =  3
 100 =  9
 120 = 15
 210 = 21
1000 = 27

沒有出現真正的模式,但請考慮一下:每個以 0 結尾的基數為 3 的數字肯定可以被 3 整除。偶數也可以被 6 整除; 所以基數 3 表示以 0 結尾的奇數必須與 3 mod 6 一致。因為 3 的所有冪都是奇數,我們知道如果字符串中 1 的個數是奇數,我們就有一個奇數。

所以,我們的條件是:

  1. 字符串以 1 開頭;
  2. 字符串有奇數個 1;
  3. 字符串以 2 結尾;
  4. 字符串可以包含任意數量的 2 和 0。

要獲得此類 DFA 中的最小狀態數,我們可以使用以空字符串開頭的 Myhill-Nerode 定理:

  1. 空字符串后面可以跟該語言中的任何字符串。 稱其等價類 [e]
  2. 字符串 0 后面不能跟任何東西,因為有效的 base-3 表示沒有前導 0。 稱其為等價類 [0]。
  3. 字符串 1 后面必須跟有以 2 結尾的偶數個 1 的內容。調用它的等價類 [1]。
  4. 字符串 2 后面可以跟該語言中的任何內容。 實際上,您可以驗證將 2 放在該語言中任何字符串的前面會給出該語言中的另一個字符串。 但是,它也可以跟以 0 開頭的字符串。因此,它的類是新的:[2]。
  5. 字符串 00 后面不能跟任何修復它的東西; 它的類與其前綴 0 [0] 相同。 字符串 01 相同。
  6. 字符串 10 后面可以跟任何以 2 結尾的偶數個 1 的字符串; 因此它等價於類 [1]。
  7. 字符串 11 后面可以跟任何語言中的任何字符串; 實際上,您可以驗證在該語言中的任何字符串前添加 11 會提供另一種解決方案。 但是,它也可以后跟以0開頭的字符串。因此,它的類與[2]相同。
  8. 12 后面可以跟一個以 2 結尾的偶數個 1 的字符串,以及空字符串(因為 12 實際上在語言中)。 這是一個新類,[12]。
  9. 21 等於 1; 類 [1]
  10. 22 等於 2; 類 [2]
  11. 20 相當於 2; 類 [2]
  12. 120 與 1 沒有區別; 它的類是[1]。
  13. 121 與 [2] 沒有區別。
  14. 122 與 [12] 沒有區別。

我們在長度為 3 的新字符串上沒有看到新的等價類; 所以,我們知道我們已經看到了所有的等價類。 它們如下:

  • [e]: 語言中的任何字符串都可以跟在這個后面
  • [0]:沒有字符串可以跟在這個后面
  • [1]:以2結尾的偶數個1的字符串可以跟在這個后面
  • [2]:與 [e] 相同,但也是以 0 開頭的字符串
  • [12]: 同 [1] 但也是空字符串

這意味着我們語言的最小 DFA 有五個狀態。 這是 DFA:

      [0]
       ^
       |
       0
       |
----->[e]--2-->[2]<-\
       |        ^   |
       |        |   |
       1   __1__/   /
       |  /        /
       | |         1
       V V         |
       [1]--2-->[12]
         ^       |
         |       |
         \___0___/

(未圖示的轉換是各自狀態的自循環)。

注意:我希望這個 DFA 有 6 個狀態,正如 Welbog 在另一個答案中指出的那樣,所以我可能錯過了一個等價類。 然而,在檢查了幾個例子並思考它在做什么之后,DFA 似乎是正確的:你只能通過將 2 作為最后一個符號(絕對必要)來接受狀態 [12],並且你只能進入狀態 [12]從狀態 [1] 開始,您必須看到奇數個 1 才能到達 [1] ...

幾乎所有模數問題的最小狀態數是模數的基礎。 一般策略是每個模數都有一個狀態,因為模數之間的轉換與之前的數字無關。 例如,如果您處於狀態r4 (代表x = 4 (mod 6) ),並且您遇到1作為下一個輸入,則您的新模數為4x6+1 = 25 = 1 (mod 6) ,因此轉換從輸入1上的r4r1 你會發現 start state 和r0可以合並,總共有 6 個 state。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM