zoukankan      html  css  js  c++  java
  • 维特比算法基础

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

  • 相关阅读:
    [leetcode.com]算法题目
    [leetcode.com]算法题目
    [leetcode.com]算法题目
    [实战演练]2014年人人公司应届生校招技术笔试题
    [杂谈]笔试中一些数字逻辑推理(非技术)
    [实战演练]腾讯2013年校招软件开发类笔试题目(选择题部分)
    [实战演练]史上最长最醒目的队名
    [Linux]在linux中,常常用到ctrl和其他按键组合,常用的有哪些及意义呢
    [linux] grep awk sort uniq学习
    [IDEA] 快捷键学习
  • 原文地址:https://www.cnblogs.com/ryuham/p/4686496.html
Copyright © 2011-2022 走看看