维特比算法整理(参考《数学之美》)

解决问题:篱笆网络中的最短路径

维特比算法整理(参考《数学之美》)_第1张图片
X i j X_{ij} Xij表示第 i i i个时刻的第 j j j个可能值,其中, 1 ≤ i ≤ d 1\leq i\leq d 1id;每个时刻可能的取值个数分别为 n 1 , n 2 , … , n d n_1,n_2,…,n_d n1,n2,,nd;算法目标为从S开始,找到一条路径到E,使得路径上所有节点值加起来最小。

算法基础

  1. 如果最短路径P经过点 X i j X_{ij} Xij,那么路径P的从S到点 X i j X_{ij} Xij的子路径Q一定是S到 X i j X_{ij} Xij之间的最短路径;否则,存在另一条从S到 X i j X_{ij} Xij的更短路径R,用R代替Q,则得到比P更短的路径,这与已知条件矛盾。
  2. 从S到E,一定经过任一时刻i的某个取值,即路径一定经过每个时刻的某一个节点。假定 i i i时刻有 n i n_i ni个状态,那么如果记录了从S到时刻 i i i的所有 n i n_i ni个状态的最短路径,最终的最短路径必然经过其中一条。
  3. 结合1和2,假定从时刻 i i i进入时刻 i + 1 i+1 i+1时,从S到时刻 i i i上各个节点的最短路径已经找到,并且记录在对应节点上,那么在计算从S到时刻 i + 1 i+1 i+1的某个节点的最短路径时,只要考虑从S到时刻i所有的 n i n_i ni个节点的最短路径,以及从这 n i n_i ni个节点到 i + 1 i+1 i+1时刻所有 n i + 1 n_{i+1} ni+1的距离即可。

算法步骤

  1. 从点S出发,对于时刻 i = 1 i=1 i=1 n 1 n_1 n1个节点,计算从S到它们之间的最短距离 d ( S , X 1 j ) d(S,X_{1j}) d(S,X1j),其中, j = 1 , 2 , . . . , n 1 j=1,2,...,n_1 j=1,2,...,n1。显然,S到任一 X 1 j X_{1j} X1j的距离即为最短距离。
  2. i = 1 i=1 i=1 i = 2 i=2 i=2时,需针对 i = 2 i=2 i=2 n 2 n_2 n2个节点,计算S到它们的最短距离。对于某个特定的节点 X 2 j X_{2j} X2j,从S到该点的路径可以经过 i = 1 i=1 i=1时刻所有 n 1 n_1 n1个节点中的任意一个,因此,对应路径的长度为 d ( S , X 2 j ) = d ( S , X 1 j 1 ) + d ( X 1 j 1 , X 2 j ) d(S,X_{2j})=d(S,X_{1j_1})+d(X_{1j_1},X_{2j}) d(S,X2j)=d(S,X1j1)+d(X1j1,X2j) j 1 j_1 j1 n 1 n_1 n1种可能性,因此S到 X 2 j X_{2j} X2j的最短路径为:
    d ( S , X 2 j ) = m i n j 1 ∈ [ 1 , n 1 ] ( d ( S , X 1 , j 1 ) + d ( X 1 j 1 , X 2 , j ) ) d(S,X_{2j})=min_{j_1\in [1,n_1]}(d(S,X_{1,j_1})+d(X_{1j_1},X_{2,j})) d(S,X2j)=minj1[1,n1](d(S,X1,j1)+d(X1j1,X2,j))
    因此,对于 i = 2 i=2 i=2的每个节点需要进行 n 1 n_1 n1次乘法运算,一共需要进行 n 1 ∗ n 2 n_1*n_2 n1n2次乘法。
  3. 采用与2中类似的步骤,对于每个 i i i的值进行运算,就可以得到全局最短路径。

复杂度分析

时间状态数为 d d d,记对于任一时刻所可能取值的个数的最大值为N,那么整个算法需要进行运算的次数不超过 d ∗ N 2 d*N^2 dN2

你可能感兴趣的:(数据结构与算法)