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

  • 相关阅读:
    (OK) usbip-utils
    How To Set Up A USB-Over-IP Server And Client With Ubuntu 10.04
    linux内核模块获取设备IP地址
    (OK) 国内常用NTP服务器地址及IP
    2017年我国将开始部署和建设IPv6地址项目
    C++之STL和Boost
    linux内核IOCTL网络控制框架实现分析
    2016年 AI 技术发展综述
    2016年SDN/NFV开源三大趋势
    Angular
  • 原文地址:https://www.cnblogs.com/ryuham/p/4686496.html
Copyright © 2011-2022 走看看