C语言维特比算法,viterbi维特比算法
維特比算法:使用動態規劃,找出最短路徑
以下以圖的形式來解釋:
圖的節點按列組織,每列的節點數量可以不一樣,每一列的節點只能和相鄰列的節點相連,不能跨列相連,節點之間有著不同的距離,距離的值就不在圖上一一標注出來了,大家自行腦補。
過程其實很簡單:
為了找出S到E之間的最短路徑,我們先從S開始從左到右一列一列地來看。
首先起點是S,從S到A列的路徑有三種可能:S-A1、S-A2、S-A3,如下圖:
我們不能武斷的說S-A1、S-A2、S-A3中的哪一段必定是全局最短路徑中的一部分,目前為止任何一段都有可能是全局最短路徑的備選項。
我們繼續往右看,到了B列。B列的B1、B2、B3逐個分析。
先看B1:
如上圖,經過B1的所有路徑只有3條:
S-A1-B1
S-A2-B1
S-A3-B1
以上這三條路徑,我們肯定可以知道其中哪一條是最短的(把各路徑每段距離加起來比較一下就知道哪條最短了)。假設S-A3-B1是最短的,那么我們就知道了經過B1的所有路徑當中S-A3-B1是最短的,其它兩條路徑路徑S-A1-B1和S-A2-B1都比S-A3-B1長,絕對不是目標答案,可以大膽地刪掉了。刪掉了不可能是答案的路徑,就是viterbi算法(維特比算法)的重點,因為后面我們再也不用考慮這些被刪掉的路徑了。現在經過B1的所有路徑只剩一條路徑了,如下圖:
接下來,我們繼續看B2:
如上圖,經過B2的路徑有3條:S-A1-B2、S-A2-B2、S-A3-B2這三條路徑中我們肯定也可以知道其中哪一條是最短的,假設S-A1-B2是最短的,那么我們就知道了經過B2的所有路徑當中S-A1-B2是最短的,其它兩條路徑路徑S-A2-B2和S-A3-B1也可以刪掉了。經過B2所有路徑只剩一條,如下圖:
接下來我們繼續看B3:
如上圖,經過B3的路徑也有3條:S-A1-B3、 S-A2-B3 、 S-A3-B3這三條路徑中我們也肯定可以知道其中哪一條是最短的,假設S-A2-B3是最短的,那么我們就知道了經過B3的所有路徑當中S-A2-B3是最短的,其它兩條路徑路徑S-A1-B3和S-A3-B3也可以刪掉了。經過B3的所有路徑只剩一條,如下圖:
現在對于B列的所有節點我們都過了一遍,B列的每個節點我們都刪除了一些不可能是答案的路徑,看看我們剩下哪些備選的最短路徑,如下圖:
上圖是我們我們刪掉了其它不可能是最短路徑的情況,留下了三個有可能是最短的路徑:S-A3-B1、S-A1-B2、S-A2-B3。現在我們將這三條備選的路徑匯總到下圖:
S-A3-B1、S-A1-B2、S-A2-B3都有可能是全局的最短路徑的備選路徑,我們還沒有足夠的信息判斷哪一條一定是全局最短路徑的子路徑。 如果我們你認為沒毛病就繼續往下看C列,如果不理解,回頭再看一遍,前面的步驟決定你是否能看懂viterbi算法(維特比算法)。 接下來講到C列了,類似上面說的B列,我們從C1、C2、C3一個個節點分析。經過C1節點的路徑有:S-A3-B1-C1、S-A1-B2-C1、S-A2-B3-C1
和B列的做法一樣,從這三條路徑中找到最短的那條(假定是S-A3-B1-C1),其它兩條路徑同樣道理可以刪掉了。那么經過C1的所有路徑只剩一條,如下圖:
同理,我們可以找到經過C2和C3節點的最短路徑,匯總一下:
到達C列時最終也只剩3條備選的最短路徑,我們仍然沒有足夠信息斷定哪條才是全局最短。
最后,我們繼續看E節點,才能得出最后的結論。
到E的路徑也只有3種可能性
E點已經是終點了,我們稍微對比一下這三條路徑的總長度就能知道哪條是最短路徑了。
在效率方面相對于粗暴地遍歷所有路徑,viterbi 維特比算法到達每一列的時候都會刪除不符合最短路徑要求的路徑,大大降低時間復雜度。
viterbi算法果然很簡單吧!
總結
以上是生活随笔為你收集整理的C语言维特比算法,viterbi维特比算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: base64编码计算机网络,【MIME协
- 下一篇: android 2d动画制作,2D游戏动