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

     
     
  • 相关阅读:
    原生代码实现Promise
    HTTP与HTTPS的区别
    windows常用命令-长期更新
    git 常用命令
    原型和原型链
    vue 中一些API 或属性的常见用法
    移动端屏幕适配
    Nuxt.js(开启SSR渲染)
    vue+element-ui 实现分页(根据el-table内容变换的分页)
    vue中引入jQuery和bootstrap
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/7766931.html
Copyright © 2011-2022 走看看