码迷,mamicode.com
首页 > 编程语言 > 详细

维特比算法基础

时间:2015-07-29 18:43:21      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:

    维特比算法是一个特殊,但应用最广的动态规划算法。利用动态规划,可以解决任何一个图中的最短路径问题。而维特比算法是针对一个特殊的图--篱笆网络(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

维特比算法基础

标签:

原文地址:http://www.cnblogs.com/ryuham/p/4686496.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!