5分钟理解维特比算法

    安德鲁·维特比老人家发明了维特比算法,用非常巧妙的方法简化了隐马尔可夫第二个问题运算过程。维特比先生后来发明了CDMA技术并与人一起创办了高通公司,高通现在是通信巨头,不生产产品却每年收取大量的专利费。

    下面我们用简单的例子(而不是深奥的数学公式)来理解维特比算法。

标题

    图1中有若干个节点,S是起点,D0是终点,节点之间的连线是通道,每条通道的路程各不相同,现在问从起点S出发,到达终点D0的最短路径是什么?

 

    最直接最笨的办法是,把所有可能的路径都列出来,然后把路径中各通道长度累加起来,再相互比较哪条路径最短。为了描述方便,用线的两个节点来表示两点的路程,S_A0表示S到A0的路程,A0_B0表示A0到B0的路程。

第1条路径的长度为:S_A0 + A0_B0 + B0_C0 + C0_D0

第2条:S_A0 + A0_B0 + B0_C1 + C1_D0

第3条:S_A0 + A0_B0 + B1_C0 + C0_D0

第4条:S_A0 + A0_B0 + B1_C1 + C0_D0

第5条:S_A0 + A1_B0 + B0_C0 + C0_D0

第6条:S_A0 + A1_B0 + B0_C1 + C1_D0

第7条:S_A0 + A1_B0 + B1_C0 + C0_D0

第8条:S_A0 + A1_B0 + B1_C1 + C0_D0

    这种方法虽然最容易想到,但是计算量会随着节点数的增加而急剧增加。图中,除了起始点S和终点D0,其他的节点有2行3列,可能的路径有2^3=8条,每条路径有3个加法运算,总计算量是2^3*3=24。如果有10行10列个节点,总计算量是10^10*10=10^11,是100亿次加法。

    维特比算法可以大大减少这个问题的运算量。维特比算法的主要思想是把一个大问题分解成形式相同的小问题,在知道小问题的答案后可以以递推方式算出大问题的答案。比如把n行m列的大问题,转变成求解n行m-1列的小问题,而问题的形式相同,解法相同,n行m-1列的问题又继续分解成n行m-2列的更小问题,直到分解成n行1列这种最简单的问题。而问题的关键是如何在已经知道n行m-1列的问题答案,来求n行m列的答案。

图2
图3

    现在我们假设我已经知道S到C0的最短路径的走法minTrack_S_C0(假设是图2中橙色的路径S-A0-B1-C0)和这段路径的长度minLength_S_C0,以及S到C1的最短路径的走法minTrack_S_C1(假设图3中橙色路径S-A0-B0-C1)和路径上的长度minLength_S_C1,要计算S到D0的最短路径的走法以及长度。

 

图4
图5

 

    为了不受干扰,我们用虚线表示S到C0的最短路径,这条路径是从S出发,终点为C0的若干条路径中的一条,而且路程是这几条中最短。同理S到C1的最短路径也用虚线表示,它也是从S出发到C1的若干条路径中的一条,而且路程是这几条中最短。

    那S到D0的最短路径就是minLength_S_C0 + C0_D0 和minLength_S_C1 + C1_D0 这两条中最短的一条。

    同理,从S到D1的最短路径是 minLength_S_C0 + C0_D1 和 minLength_S_C1 + C1_D1这两条中最短的一条。

    那有没有可能找到一条从S到C0的另外一条路径,长度比最短路径minLength_S_C0大,但与后面加起来却是总长度最短呢?这个在图中看就能看出明显不可能的,因为后面一部分的长度大家都一样,前面一段的长度又比最短路径长,总长度肯定不会是最短。

    现在分析维特比算法的计算量是多少。在已经知道S到C0的最短路径和S到C1的最短路径,计算S分别到D0和D1的最短路径,增加了哪些运算呢?增加了2*2=4次加法运算。如果是n行m列个节点,那就是增加了n*n次运算,所有列的运算量总和是n*n*m。如果用前面10行10列的例子,总运算量是10*10*10 = 1000次,比之前100亿次少了几个数量级。

    维特比算法用个更加通俗的例子说明它的主要思想:假设要找出某种竞技活动全国最优秀的人,不需要把全国10几亿人拿来比赛,这样代价过高,而是先找各省的冠军来比赛,决出全国冠军。各省的冠军又是从各地市的冠军中选拔,各地市冠军从各区县中选拔,就这样一级一级分解到一个最小规模的比赛。这样比赛的成本就大大降低,但同样能达到选出全国最优秀人才的目的。维特比算法就是一种动态规划的算法。理解了维特比算法,你就理解了动态规划。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值