確定有限狀態自動機最小化

<image>

<image>

在自動機理論（電腦科學的一個分支）中，確定有限狀態自動機最小化是將給定的確定有限狀態自動機（DFA, Deterministic Finite Automaton）改造為等價且擁有最少狀態的DFA的過程。這裡，兩個DFA等價意味著他們識別相同的正則語言。各自動機理論的教材中，已經給出了若干已知的最小化演算法。

## 最小DFA

對於每個正則語言，都存在一個最小自動機接受它，即一個有著最小狀態數目的DFA，且這個DFA是唯一的（除去狀態命名不同的差別）。最小DFA保證了其在模式匹配等計算應用中開銷的最小。

在不影響原始DFA所接受語言的情況下，有兩類狀態可以被移除或合併，以實現最小化過程。

- 不可達狀態指DFA在任意輸入串下都無法達到的狀態。
- 等價狀態指在同一輸入串下不產生區別的狀態。

DFA最小化通常要經歷三個步驟，分別對應於相關狀態的移除或合併。因為等價狀態的消解開銷高昂，通常會將其放到最後一步。

## 不可達狀態

DFA $M=(Q, \Sigma, \delta, q_0, F)$ 的狀態 $p$ 是不可達的，若不存在 $\Sigma^*$ 上的串 $w$，使得 $p=\delta^*(q_0, w)$。可達狀態可以用如下演算法來找到：

```ocaml
let reachable_states := {q0};
let new_states := {q0};
do {
    temp := the empty set;
    for each q in new_states do
        for each c in Σ do
            temp := temp ∪ {p such that p = δ(q,c)};
        end;
    end;
    new_states := temp \ reachable_states;
    reachable_states := reachable_states ∪ new_states;
} while (new_states ≠ the empty set);
unreachable_states := Q \ reachable_states;
```

將不可達狀態從DFA中移去並不會影響其接受的語言。

## 等價狀態

### Hopcroft演算法

根據 Hopcroft，以下演算法可用來合併等價狀態。該演算法基於劃分細化，按照狀態的行為將DFA各狀態分組。這些分組即Myhill-Nerode等價關係下的等價類，滿足同一等價類中的兩個狀態在相同的輸入下有相同的行為。即對劃分中屬於同一等價類的任意兩個狀態 $p_1$ 和 $p_2$，對所有輸入串 $w$，$w$ 所導致的轉移應當始終將 $p_1$ 和 $p_2$ 同時帶到接受狀態或同時帶到拒絕狀態。而不應當出現 $w$ 將 $p_1$ 帶到了一個接受狀態，而將 $p_2$ 帶到了一個拒絕狀態，反之亦然。

下面以偽代碼形式描述了該演算法：

```ocaml
P := {F, Q \ F};
W := {F, Q \ F};
while (W is not empty) do
     choose and remove a set A from W
     for each c in Σ do
          let X be the set of states for which a transition on c leads to a state in A
          for each set Y in P for which X ∩ Y is nonempty and Y \ X is nonempty do
               replace Y in P by the two sets X ∩ Y and Y \ X
               if Y is in W
                    replace Y in W by the same two sets
               else
                    if |X ∩ Y| <= |Y \ X|
                         add X ∩ Y to W
                    else
                         add Y \ X to W
          end;
     end;
end;
```

演算法從一個粗劃分開始：在Myhill–Nerode關係下等價的狀態對都屬於劃分中的同一子集，但此時不等價的狀態對也可能被劃入了同一子集。上述演算法逐漸將劃分細化為大量較小的集合，每一步都將各狀態集分為不等價的一對子集。起始劃分是將那些明顯沒有相同行為的狀態分為接受狀態和拒絕狀態。隨後演算法在每一輪都會從當前劃分中選中一個集合 $A$ 和一個輸入符 $c$，再將劃分中的每個集合分成兩個子集（可能為空）：在輸入 $c$ 下可以被帶到 $A$ 中狀態的狀態，和在輸入 $c$ 下不會被帶到 $A$ 中狀態的狀態。由於 $A$ 已知和劃分中其他集合具有不同的行為，$A$ 的子集也具有該性質。當找不到細分的時候，演算法終止。

最壞情況下，演算法的運行時間是 $O(ns\log n)$，其中 $n$ 為狀態數，$s$ 為字母表大小。這一時間界的得出是由於，對自動機的每 $ns$ 個轉移，每步轉移在切分步驟中參與了 $O(\log n)$ 的複雜度。劃分細分的數據結構可以允許每步切分的操作時間和轉移次數成比例。這一演算法仍是解決該問題的已知最有效演算法，對某些輸入的隨機分布，演算法平均複雜度的時間界要更好，為 $O(\log\log n)$.

當Hopcroft演算法已經將DFA中的狀態劃分為等價類，最小DFA就可以通過為每個等價類生成一個狀態來構造了。若 $S$ 是劃分 $P$ 的一個狀態集，$s$ 是 $S$ 中的一個狀態，$c$ 是一個字符輸入；那麼最小DFA的狀態轉移從 $S$ 起始，在 $c$ 下轉移到原自動機從狀態 $s$ 在輸入 $c$ 下轉移到的狀態集。最小DFA的起始狀態是包含有原DFA起始狀態的集合，接受狀態是其成員為原DFA中接受狀態的集合。

### Moore演算法

Moore DFA最小化演算法由 給出。與 Hopcroft 演算法類似地，它維護一個劃分，且這個劃分的初值為接受和拒絕狀態的劃分，並同樣反覆細化直至無法繼續細化。在每一步中，它都會用 s + 1 個劃分的最粗公細化 (coarsest common refinement) 來替代當前的劃分，這 $s+1$ 個劃分中的一個是當前劃分，其他的 $s$ 個則是當前劃分在轉移函數和在所有輸入符號下的原象。當這一操作無法改善當前劃分時，演算法即停止。這個演算法在最壞情況下的複雜度是 $O(n^2s)$：演算法的每個步驟都需要 $O(ns)$，這是基數排序一個變種用以重排狀態的複雜度，狀態重排使得新劃分下同一集合中狀態的編號順序是接連的。又，最多會有 $n$ 輪，因為除最後一輪外，每輪都使得劃分中的集合數目增加。在Moore演算法下導致最壞情況的DFA最小化問題實例和Hopcroft演算法是相同的。演算法的輪數會比 $n$ 小得多，所以平均上（$s$ 是常數），其性能可達 $O(n\log n)$ 甚至 $O(n\log\log n)$，結果取決於建模平均情況行為的自動機隨機選取分布方式。

### Brzozowski演算法

Brzozowski 注意到，將DFA的邊反轉將產生一個原語言反序的非確定有限狀態自動機 (NFA)。再將這個NFA用標準的冪集構造法（只構造轉換後DFA的可達狀態）轉換為DFA，就會產生原語言反序的最小DFA。重複反轉操作，就可以得到原語言的最小DFA。Brzozowski演算法在最壞情況下的複雜度是指數的，因為存在這樣的正則語言，其反序的最小DFA的規模是原語言DFA規模的指數大。但通常來說這個演算法比最壞情況表現得要好。

## NFA最小化

以上的步驟都對DFA有效，可是劃分的方法並不適用於非確定有限狀態自動機 (NFA)。雖然窮舉搜索可以最小化NFA，但並沒有一個多項式時間的演算法可以完成該過程，除非 P=PSPACE（計算複雜性理論中的一個未解決問題，一般認為很可能P≠PSPACE）。然而的確存在比暴力搜索可能更加有效的NFA最小化演算法。

## 外部連結

- 使用Myhill-Nerode定理做DFA最小化