1. 程式人生 > >維特比算法基礎

維特比算法基礎

mage 解碼 post 短路徑 接下來 符號 方法 公式 狀態

維特比算法基礎

維特比算法是一個特殊,但應用最廣的動態規劃算法。利用動態規劃,可以解決任何一個圖中的最短路徑問題。而維特比算法是針對一個特殊的圖--籬笆網絡(Lattice)的有向圖最短路徑問題而提出的。它之所以重要是因為,凡是使用隱含馬爾科夫模型描述的問題都可以用它來解碼。

假如用戶輸入的拼音是y1,y2,...,yn,對應的漢字是x1,x2,...,xn,根據概率公式:

技術分享

輸入的序列為y1,y2,...,yN,而產生他們的隱含序列是x1,x2,...,xN,可以用下圖描述這個過程:

技術分享

圖1 適合維特比算法的隱含馬爾科夫模型

現在這個馬爾可夫鏈的每個狀態的輸出是固定的,但是每個狀態的值可以變化。比如輸出讀音"zhong"的字可以是“中”,“種”等多個字。用符號xij表示狀態xi的第j個可能的值。如果把每個狀態按照不同的值展開,就得到下面這個籬笆網絡:

技術分享

圖2 籬笆網絡

在上圖中,每個狀態有3個或4個值,當然實際中他們可以有任意個值。

總結算法如下:

第一步,從點S出發,對於第一個狀態x1的各個節點,不妨假定有n1個,計算出S到他們的距離d(S,x1i),其中x1i代表任意狀態1的節點。

第二步,對於第二個狀態x2的所有節點,要計算出從S到它們的最短距離。對於特定的節點x2i,從S到它的路徑可以經過狀態1的n1中任何一個節點x1i,當然,對應的路徑長度就是d(S,x2i) = d(S,x1j) + d(x1j,x2i)。由於j有n1種可能性,我們要一一計算,然後找到最小值。即

d(S,x2i) = min d(S,x1j) + d(x1j,x2i)

這樣對於第二個狀態的每個節點,需要進行n1次計算。假定這個狀態有n2個節點,把S這些節點的距離都算一遍,就有O(n1·n2)次計算。

接下來,類似的按照上訴方法從第二個狀態走到第三個狀態,一直走到最後一個狀態,就得到了整個網絡從頭到尾的最短路徑。復雜度為O(N·D^2)。

參考書籍

http://www.cnblogs.com/ryuham/p/4686594.html

維特比算法基礎