維特比算法是一個特殊但應用最廣的動態規劃算法。利用動態規劃,可以解決任何一個圖中的最短路徑問題。而維特比算法是針對一個特殊的圖——籬笆網絡(Lattice)的有向圖最短路徑的問題而提出的。它之所以重要,是因爲凡是使用隱含馬爾可夫模型描述的問題都可以使用它來解碼,包括今天的數字通信、語音識別、機器翻譯、拼音轉漢字、分詞等。下面用輸入法拼音轉漢字來說明。
假定用戶盲打時輸入的拼音是,對應的漢字是(爲簡單起見,以字爲單位來解釋維特比算法),那麼隱含的狀態序列即爲在輸出序列發生的條件下概率最大的那條序列:
輸入爲可見序列,產生他們的隱含序列。下圖爲隱含的馬爾可夫模型
這是一個相對簡單的隱含馬爾可夫鏈,沒有狀態跳躍,也沒有狀態自環。是狀態之間的轉移概率,是每個狀態的產生概率。現在,這個馬爾可夫鏈的輸出已固定,但是狀態不固定,比如拼音“zhong”爲輸出,狀態可能爲“中”、“種”等。我們不妨抽象一點,把表示爲狀態的第j個可能的值。如果把每個狀態按照不同的值展開,可得到下面的籬笆網絡(Lattice):
上圖中每個狀態可能有3,4個值,實際上它們可以有任意個值
維特比算法的基礎可以概括爲下面三點:
- 如果概率最大的路徑P(或者說最短路徑)經過某個點,如圖中的,那麼這條路徑上從起始點S到的這一段子路徑Q,一定是S到之間的最短路徑。
- 從S到E路徑必定經過第i時刻的某個狀態
- 結合上述兩點,假定當我們從狀態i進入到狀態i+1時,從S到狀態i的各個可能值的最短路徑都已找到,那麼只需考慮起到S到狀態i各個結點的最短路徑到狀態i+1的各個結點的最短路徑即可。
基於上述三點,維特比總結了如下算法:
第一步,從起點S出發,對於第一個狀態的各個結點,不妨假定有個,計算出S的距離d(S,)
第二步,這是整個算法的關鍵。對於第二個狀態的所有結點,要計算出S到它們的最短距離。我們知道,對於特定的結點,從S到它的路徑可以經過狀態1到中任何一個結點,我們需要找到這些路徑的最小值。這樣對於第二個狀態的每個結點,需要進行次乘法運算,假定這個狀態有個結點,把S到這些結點的距離都算一遍,就有次運算。
接下來,類似的從第二個狀態走到第三個狀態,一直走到最後一個狀態,就得到了整個網格從頭到尾的最短路徑。每一步狀態轉換的複雜度爲。如果假定在這個隱含馬爾可夫鏈中結點最多的狀態有D個結點,也就是這個那個網格的寬度爲D,那麼任何一步的複雜度不超過,由於網格長度爲N,所以整個維特比算法的複雜度是.