维特比算法

article/2025/10/3 23:20:22

1. 概述

  维特比算法是安德鲁.维特比(Andrew Viterbi)于1967年为解决通信领域中的解码问题而提出的,它同样广泛用于解决自然语言处理中的解码问题,隐马尔可夫模型的解码是其中典型的代表。无论是通信中的解码问题还是自然语言处理中的解码问题,本质上都是要在一个篱笆网络中寻找得到一条最优路径。
  所谓篱笆网络,指的是单向无环图,呈层级连接,各层节点数可以不同。如图是一个篱笆网络,连线上的数字是节点间概念上的距离(如间距、代价、概率等),现要找到一条从起始点到终点的最优路径。
在这里插入图片描述
  在实际问题中,节点数和层数往往是大量的,因而采取遍历所有的路径计算其距离进行比较的方式是不可行的。维特比算法正是通过动态规划的方式高效求得这条最优路径。


2.算法原理

  该问题具有这样一个特性,对于最优(如最短距离)的路径,任意一段子路径一定是该段两端点间所有可达路径中最优的,如若不然,将该段中更优的子路径接到两端点便构成了另一个整体最优路径,这是矛盾的。或者说,最优路径中,从起始点到由近及远的任一点的子路径,一定是该段所有可达路径中最优的。也即,整体最优,局部一定最优
在这里插入图片描述
  该特性也就是说,对每个节点而言,如果最优路径经过这一点,则一定是经过从起始点到这点的这段最优路径。那么,只要从头开始,由局部向整体推进,渐次地找到起始点到当前点的最优路径,算至终点便得到了整体最优路径。这样的方式叫做动态规划,是维特比算法的基本思想。

维特比算法求解篱笆网络最短路径的过程为:
  从第一层开始,对每一层的每一个节点,计算出起始点到它的最短距离,并记录下相应最短路径下它的前一个节点,逐层递推,算至终止点时便得到了整体最短距离,再依照节点记录下的前置节点进行回溯,就得到了最短路径的序列。对第 i i i层第 j j j个节点 P i , j P_{i,j} Pi,j,假设起始点到它的最短距离为 D ( P i , j ) D\left( P_{i,j} \right) D(Pi,j),相应最短路径下它的前一个节点为 P r e ( P i , j ) Pre\left( P_{i,j} \right) Pre(Pi,j),则

D ( P i , j ) = min ⁡ 1 ≤ k ≤ N [ D i − 1 , k + d ( P i − 1 , k , P i , j ) ] D\left( P_{i,j} \right)=\min_{1\leq k \leq N}{\left[ D_{i-1,k}+d(P_{i-1,k},P_{i,j}) \right]} D(Pi,j)=1kNmin[Di1,k+d(Pi1,k,Pi,j)]
也就是,对前一层的所有节点,计算每一个节点的记录的最短距离D与它到当前节点的距离d的和,取其中最小的那个值(其中, d ( A , B ) d(A,B) d(A,B)表示A,B两节点间的距离。).

P r e ( P i , j ) = P i − 1 , j ∗ = a r g min ⁡ 1 ≤ k ≤ N [ D i − 1 , k + d ( P i − 1 , k , P i , j ) ] Pre\left( P_{i,j} \right)=P_{i-1,j\ast}=arg\min_{1\leq k \leq N}{\left[ D_{i-1,k}+d(P_{i-1,k},P_{i,j}) \right]} Pre(Pi,j)=Pi1,j=arg1kNmin[Di1,k+d(Pi1,k,Pi,j)]
也就是,满足距离最短的那条路径上在前一层的节点.


3.示例

  在如下网络中,连线上的数字是节点间的距离,求S点到E点的最短距离和与之对应的路径。
在这里插入图片描述
第一层:
对节点 P 1 , 1 P_{1,1} P1,1
起始点到它只有一条路径,最短距离 D ( P 1 , 1 ) = 2 D(P_{1,1})=2 D(P1,1)=2,前一个节点 P r e ( P 1 , 1 ) = S Pre(P_{1,1}) = S Pre(P1,1)=S

对节点 P 1 , 2 P_{1,2} P1,2
起始点到它只有一条路径,最短距离 D ( P 1 , 2 ) = 1 D(P_{1,2}) = 1 D(P1,2)=1,前一个节点 P r e ( P 1 , 2 ) = S Pre(P_{1,2}) = S Pre(P1,2)=S

对节点 P 1 , 3 P_{1,3} P1,3
起始点到它只有一条路径,最短距离 D ( P 1 , 3 ) = 3 D(P_{1,3}) = 3 D(P1,3)=3,前一个节点 P r e ( P 1 , 3 ) = S Pre(P_{1,3}) = S Pre(P1,3)=S
在这里插入图片描述
第二层:
对节点 P 2 , 1 P_{2,1} P2,1
D ( P 1 , 1 ) + d ( P 1 , 1 , P 2 , 1 ) = 2 + 3 = 5 D(P_{1,1}) + d(P_{1,1},P_{2,1}) = 2 + 3 = 5 D(P1,1)+d(P1,1P2,1)=2+3=5
D ( P 1 , 2 ) + d ( P 1 , 2 , P 2 , 1 ) = 1 + 2 = 3 D(P_{1,2}) + d(P_{1,2},P_{2,1}) = 1 + 2 = 3 D(P1,2)+d(P1,2P2,1)=1+2=3
D ( P 1 , 3 ) + d ( P 1 , 3 , P 2 , 1 ) = 3 + 9 = 12 D(P_{1,3}) + d(P_{1,3},P_{2,1}) = 3 + 9 = 12 D(P1,3)+d(P1,3P2,1)=3+9=12
最短距离 D ( P 2 , 1 ) = m i n { 5 , 3 , 12 } = 3 D(P_{2,1}) = min\left\{ 5,3,12 \right\} = 3 D(P2,1)=min{5,3,12}=3,前一个节点 P r e ( P 2 , 1 ) = P 1 , 2 Pre(P_{2,1}) = P_{1,2} Pre(P2,1)=P1,2 ;

对节点 P 2 , 2 P_{2,2} P2,2
D ( P 1 , 1 ) + d ( P 1 , 1 , P 2 , 2 ) = 2 + 6 = 8 D(P_{1,1}) + d(P_{1,1},P_{2,2}) = 2 + 6 = 8 D(P1,1)+d(P1,1P2,2)=2+6=8
D ( P 1 , 2 ) + d ( P 1 , 2 , P 2 , 2 ) = 1 + 5 = 6 D(P_{1,2}) + d(P_{1,2},P_{2,2}) = 1 + 5 = 6 D(P1,2)+d(P1,2P2,2)=1+5=6
D ( P 1 , 3 ) + d ( P 1 , 3 , P 2 , 2 ) = 3 + 2 = 5 D(P_{1,3}) + d(P_{1,3},P_{2,2}) = 3 + 2 = 5 D(P1,3)+d(P1,3P2,2)=3+2=5
最短距离 D ( P 2 , 2 ) = m i n { 8 , 6 , 5 } = 5 D(P_{2,2}) = min\left\{ 8,6,5 \right\} = 5 D(P2,2)=min{8,6,5}=5,前一个节点 P r e ( P 2 , 2 ) = P 1 , 3 Pre(P_{2,2}) = P_{1,3} Pre(P2,2)=P1,3 ;

对节点 P 2 , 3 P_{2,3} P2,3
D ( P 1 , 1 ) + d ( P 1 , 1 , P 2 , 3 ) = 2 + 4 = 6 D(P_{1,1}) + d(P_{1,1},P_{2,3}) = 2 + 4 = 6 D(P1,1)+d(P1,1P2,3)=2+4=6
D ( P 1 , 2 ) + d ( P 1 , 2 , P 2 , 3 ) = 1 + 7 = 8 D(P_{1,2}) + d(P_{1,2},P_{2,3}) = 1 + 7 = 8 D(P1,2)+d(P1,2P2,3)=1+7=8
D ( P 1 , 3 ) + d ( P 1 , 3 , P 2 , 3 ) = 3 + 6 = 9 D(P_{1,3}) + d(P_{1,3},P_{2,3}) = 3 + 6 = 9 D(P1,3)+d(P1,3P2,3)=3+6=9
最短距离 D ( P 2 , 3 ) = m i n { 6 , 8 , 9 } = 6 D(P_{2,3}) = min\left\{ 6,8,9 \right\} = 6 D(P2,3)=min{6,8,9}=6,前一个节点 P r e ( P 2 , 3 ) = P 1 , 1 Pre(P_{2,3}) = P_{1,1} Pre(P2,3)=P1,1 ;
在这里插入图片描述
第三层:
对节点 P 3 , 1 P_{3,1} P3,1
D ( P 2 , 1 ) + d ( P 2 , 1 , P 3 , 1 ) = 3 + 9 = 12 D(P_{2,1}) + d(P_{2,1},P_{3,1}) = 3 + 9 = 12 D(P2,1)+d(P2,1P3,1)=3+9=12
D ( P 2 , 2 ) + d ( P 2 , 2 , P 3 , 1 ) = 5 + 2 = 7 D(P_{2,2}) + d(P_{2,2},P_{3,1}) = 5 + 2 = 7 D(P2,2)+d(P2,2P3,1)=5+2=7
D ( P 2 , 3 ) + d ( P 2 , 3 , P 3 , 1 ) = 6 + 6 = 12 D(P_{2,3}) + d(P_{2,3},P_{3,1}) = 6 + 6 = 12 D(P2,3)+d(P2,3P3,1)=6+6=12
最短距离 D ( P 3 , 1 ) = m i n { 12 , 7 , 12 } = 7 D(P_{3,1}) = min\left\{ 12,7,12 \right\} = 7 D(P3,1)=min{12,7,12}=7,前一个节点 P r e ( P 3 , 1 ) = P 2 , 2 Pre(P_{3,1}) = P_{2,2} Pre(P3,1)=P2,2;

对节点 P 3 , 2 P_{3,2} P3,2
D ( P 2 , 1 ) + d ( P 2 , 1 , P 3 , 2 ) = 3 + 3 = 6 D(P_{2,1}) + d(P_{2,1},P_{3,2}) = 3 + 3 = 6 D(P2,1)+d(P2,1P3,2)=3+3=6
D ( P 2 , 2 ) + d ( P 2 , 2 , P 3 , 2 ) = 5 + 6 = 11 D(P_{2,2}) + d(P_{2,2},P_{3,2}) = 5 + 6 = 11 D(P2,2)+d(P2,2P3,2)=5+6=11
D ( P 2 , 3 ) + d ( P 2 , 3 , P 3 , 2 ) = 6 + 3 = 9 D(P_{2,3}) + d(P_{2,3},P_{3,2}) = 6 + 3 = 9 D(P2,3)+d(P2,3P3,2)=6+3=9
最短距离 D ( P 3 , 2 ) = m i n { 6 , 11 , 9 } = 6 D(P_{3,2}) = min\left\{ 6,11,9 \right\} = 6 D(P3,2)=min{6,11,9}=6,前一个节点 P r e ( P 3 , 2 ) = P 2 , 1 Pre(P_{3,2}) = P_{2,1} Pre(P3,2)=P2,1;

对节点 P 3 , 3 P_{3,3} P3,3
D ( P 2 , 1 ) + d ( P 2 , 1 , P 3 , 3 ) = 3 + 8 = 11 D(P_{2,1}) + d(P_{2,1},P_{3,3}) = 3 + 8 = 11 D(P2,1)+d(P2,1P3,3)=3+8=11
D ( P 2 , 2 ) + d ( P 2 , 2 , P 3 , 3 ) = 5 + 7 = 12 D(P_{2,2}) + d(P_{2,2},P_{3,3}) = 5 + 7 = 12 D(P2,2)+d(P2,2P3,3)=5+7=12
D ( P 2 , 3 ) + d ( P 2 , 3 , P 3 , 3 ) = 6 + 4 = 10 D(P_{2,3}) + d(P_{2,3},P_{3,3}) = 6 + 4 = 10 D(P2,3)+d(P2,3P3,3)=6+4=10
最短距离 D ( P 3 , 3 ) = m i n { 11 , 12 , 10 } = 10 D(P_{3,3}) = min\left\{ 11,12,10 \right\} = 10 D(P3,3)=min{11,12,10}=10,前一个节点 P r e ( P 3 , 3 ) = P 2 , 3 Pre(P_{3,3}) = P_{2,3} Pre(P3,3)=P2,3;
在这里插入图片描述
第四层(终点):
对节点 E E E
D ( P 3 , 1 ) + d ( P 3 , 1 , E ) = 7 + 3 = 10 D(P_{3,1}) + d(P_{3,1},E) = 7 + 3 = 10 D(P3,1)+d(P3,1E)=7+3=10
D ( P 3 , 2 ) + d ( P 3 , 2 , E ) = 6 + 7 = 13 D(P_{3,2}) + d(P_{3,2},E) = 6 + 7 = 13 D(P3,2)+d(P3,2E)=6+7=13
D ( P 3 , 3 ) + d ( P 3 , 3 , E ) = 10 + 6 = 16 D(P_{3,3}) + d(P_{3,3},E) = 10 + 6 = 16 D(P3,3)+d(P3,3E)=10+6=16
最短距离 D ( E ) = m i n { 10 , 13 , 16 } = 10 D(E) = min\left\{ 10,13,16 \right\} = 10 D(E)=min{10,13,16}=10,前一个节点 P r e ( E ) = P 3 , 1 Pre(E) = P_{3,1} Pre(E)=P3,1;
在这里插入图片描述
P r e ( E ) = P 3 , 1 Pre(E) = P_{3,1} Pre(E)=P3,1 P r e ( P 3 , 1 ) = P 2 , 2 Pre(P_{3,1}) = P_{2,2} Pre(P3,1)=P2,2 P r e ( P 2 , 2 ) = P 1 , 3 Pre(P_{2,2}) = P_{1,3} Pre(P2,2)=P1,3 P r e ( P 1 , 3 ) = S Pre(P_{1,3}) = S Pre(P1,3)=S
故最短距离为10,与之对应的路径为( S S S P 1 , 3 P_{1,3} P1,3 P 2 , 2 P_{2,2} P2,2 P 3 , 1 P_{3,1} P3,1 E E E).

End.


参考

  1. 吴军. 数学之美(第二版). 人民邮电出版社.
  2. 李航. 统计学习方法. 清华大学出版社.

http://chatgpt.dhexx.cn/article/X7aywZ92.shtml

相关文章

维特比算法(Viterbi algorithm)

一、维特比算法(Viterbi)原理以及简单实现 维特比算法(Viterbi algorithm)是一种动态规划算法。它用于寻找最有可能产生观测事件序列的维特比路径——隐含状态序列,特别是在马尔可夫信息源上下文和隐马尔可夫模型中。 维特比算法实际是用动…

机器学习:维特比算法(Viterbi Algorithm)

一、维特比算法(Viterbi Algorithm)讲解方式01:篱笆网络(Lattice)的最短路径问题 已知下图的篱笆网络,每个节点之间的数字表示相邻节点之间的距离,举个例子来说,如果我走&#xff0…

字符串匹配原理及实现(C++版)

字符串匹配原理及实现(C版) 1. 字符串匹配概念2. BF2.1 原理2.2 代码实现 3. KMP3.1 原理3.2 代码实现 4. BM4.1 坏字符4.2 好后缀4.3 代码实现 1. 字符串匹配概念 在查找操作中,我们用到很重要的概念就是字符串匹配,所谓字符串匹…

C++之单字符串匹配问题

有很多算法可以解决单模式匹配问题。而根据在文本中搜索模式串方式的不同,我们可以将单模式匹配算法分为以下几种: 基于前缀搜索方法:在搜索窗口内从前向后(沿着文本的正向)逐个读入文本字符,搜索窗口中文…

字符串——字符串匹配

文章目录 字符串匹配一、基本概念字符串匹配问题符号和术语后缀重叠引理 二、朴素字符串匹配算法三、Rabin-Karp算法(字符串Hash算法)进制Hash质数Hash 四、利用有限自动机进行字符串匹配有限自动机字符串匹配自动机计算状态转移函数代码 五、Knuth-Morris-Pratt算法模式的前缀…

朴素字符串匹配

描述 字符串匹配问题的形式定义: 文本(Text)是一个长度为 n 的字符串:T;模式(Pattern)是一个长度为 m 且 m≤n 的字符串:P; T 和 P 中的元素都属于有限的字母表 Σ 表; 有效位移 (Valid Shift): 如果 0≤ s ≤n-m,并且 T[s1…sm] P[1…m]&#xff0c…

算法之字符串匹配一

目录 前言: BF算法: RK算法 总结: 参考资料 前言: 字符串匹配指的是一个短点的字符串与一个长点的字符串进行匹配,并确认短的字符串是否在长的字符串中存在。匹配算法有很多,本文介绍两种简单、容易…

字符串匹配算法(C语言实现)

目录 文章目录 前言 一、BF算法 二、KMP算法 1.算法介绍 2.算法思路 3.整体代码实现 总结 前言 字符串匹配算法又称模式匹配算法,该算法的目的是为了子串从主串中寻找是否有与其匹配的部分, 其可分为BF暴力检索、RK哈希检索、KMP、BM等等,本…

shell字符串匹配

一、简介 Bash Shell提供了很多字符串和文件处理的命令。如awk、expr、grep、sed等命令,还有文件的排序、合并和分割等一系列的操作命令。grep、sed和awk内容比较多故单独列出,本文只涉及字符串的处理和部分文本处理命令。 二、字符串处理 1、expr命令…

golang字符串匹配算法

简介 字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为模式串)。在 Golang 中,可以使用最常见的字符串匹配算法之一:Knuth-Morris-Pratt(KMP)算法,它的时间复杂度为 O(nm…

【数据结构】字符串匹配(暴力匹配)

原理解析: 字符串匹配方法,创建两个字符串结构,主 串和子串比较。 主串字符 a 和 子串字符 c 不匹配,主串的指针向下移动,移动到上一次开始比较的下一个位置。 子串指向开始的位置。 主串字符 b 和 子串字符 c 不匹配…

字符串匹配算法比较

字符串匹配(string match)是在实际工程中经常会碰到的问题,通常其输入是原字符串(String)和子串(又称模式,Pattern)组成,输出为子串在原字符串中的首次出现的位置。通常精确的字符串搜索算法包括暴力搜索(Brute force)…

子串查找(字符串匹配)

子串查询 首先,我们来定义两个概念,主串和模式串。我们在字符串 A 中查找字符串 B,则 A 就是主串,B 就是模式串。我们把主串的长度记为 n,模式串长度记为 m。由于是在主串中查找模式串,因此,主串…

字符串匹配算法综述

字符串匹配算法综述 字符串匹配算法综述:BF、RK、KMP、BM、Sunday 字符串匹配算法,是在实际工程中经常遇到的问题,也是各大公司笔试面试的常考题目。此算法通常输入为原字符串(string)和子串(pattern&…

字符串匹配算法详解

希望看到文章的你们,能够在今年的研究生考试中超常发挥。 愿你们都能考上自己心仪的学校,为你们的备考生涯划上一个完美的句号。做为你们的师兄有几句话想对你们说,希望这些话能对你们有一些帮助。 马上就要考试了,不要再继续啃难…

字符串匹配算法

字符串匹配就是在主串A中查找模式串B,例如在主串abababc中查找模式串abc是否存在,记主串A的长度为n,模式串B的长度为m,n>m。 BF算法 BF(Brute Force)算法,又叫暴力匹配算法或者朴素匹配算法,思路很简单…

字符串(字符串匹配)

一、字符串匹配问题、基础 1、假设文本是一个长度为n的数组T,而模式是长度为m的数组P,我们希望在文本T中寻找模式P 如果P出现在T中的第s个位置,那么我们称其有效偏移为s,在其他不匹配的位置称为无效偏移 2、如果字符串w是字符串…

字符串匹配

字符串匹配 1.朴素的串匹配算法(暴力解法) 1.1 分析 设t是目标串(母串),p是模式串(待匹配串),i , j 分别指向 模式串 和 目标串,m、n分别是模式串p和目标串t的长度。 从目标串的第0个字符&am…

Photoshop怎么给图片添加简介信息或者版权信息

转自:Photoshop怎么给摄影图片添加作者名字版权等信息? 有时我们点开一张图片的详细信息中可能可以看到各种属性信息,比如作者,时间,关键字,图片信息描述等属性,但是我们自己的拍摄的或者从别的地方获取的…

2022年中国版权保护中心计算机软件著作权登记最全申请步骤流程

一、前言二、实名认证1. 用户注册2. 实名认证 三、办理步骤1. 办理流程2. 填写申请表3. 提交申请文件4. 登记机构受理申请5. 审查6. 获得登记证书 四、登记申请所需文件1. 软件著作权登记申请表2. 软件(程序、文档)的鉴别材料3. 有关证明文件 五、申请表…