一、問題定義
1.1 子序列
子序列是給定序列中在任意位置去掉任意多個字符后得到的結(jié)果。例如:
給定序列 X X X:
X : A B C B D A B X:ABCBDAB X:ABCBDAB
X X X的子序列:
X 1 : A B C B D A B X_1:ABCBDAB X1?:ABCBDAB
X 2 : A B C B X_2:ABCB X2?:ABCB
X 3 : A C B B X_3:ACBB X3?:ACBB
1.2 公共子序列
給定兩個序列 X X X和 Y Y Y:
X : A B C B D A B X:ABCBDAB X:ABCBDAB
Y : B D C A B A Y:BDCABA Y:BDCABA
公共子序列示例:
X 1 = Y 1 = C A X_1=Y_1=CA X1?=Y1?=CA
X 2 = Y 2 = A B A X_2=Y_2=ABA X2?=Y2?=ABA
X 3 = Y 3 = B C A B X_3=Y_3=BCAB X3?=Y3?=BCAB
1.3 問題形式化定義
最長公共子序列問題:
輸入:
\quad 序列 X = < x 1 , x 2 , . . . , x n > X=<x_1,x_2,...,x_n> X=<x1?,x2?,...,xn?>和序列 Y = < y 1 , y 2 , . . . , y m > Y=<y_1,y_2,...,y_m> Y=<y1?,y2?,...,ym?>
輸出:
\quad 求解一個公共子序列 Z = < z 1 , z 2 , . . . , z l > Z=<z_1,z_2,...,z_l> Z=<z1?,z2?,...,zl?>
\quad \quad \quad 優(yōu)化目標(biāo): m a x ∣ Z ∣ max|Z| max∣Z∣
\quad \quad \quad 約束條件: < z 1 , z 2 , . . . , z l > = < x i 1 , x i 2 , . . . , x l 1 > = < y j 1 , y j 2 , . . . , y j l > <z_1,z_2,...,z_l>=<x_{i_1},x_{i_2},...,x_{l_1}>=<y_{j_1},y_{j_2},...,y _{j_l}> <z1?,z2?,...,zl?>=<xi1??,xi2??,...,xl1??>=<yj1??,yj2??,...,yjl??>,其中 1 ≤ i 1 < i 2 < . . . < i l ≤ n ; 1 ≤ j 1 < j 2 < . . . < j l ≤ m 1\leq i_1< i_2<...<i_l\leq n;1\leq j_1<j_2<...<j_l\leq m 1≤i1?<i2?<...<il?≤n;1≤j1?<j2?<...<jl?≤m
二、求解策略
給定兩個序列 X X X和 Y Y Y:
X : A B C B D A B X:ABCBDAB X:ABCBDAB
Y : B D C A B A Y:BDCABA Y:BDCABA
其最長公共子序列 Z = B D A B Z=BDAB Z=BDAB,觀察可以發(fā)現(xiàn),其后3位為長度為3的最長公共子序列,其后2位為長度為2的最長公共子序列,最后一位為長度為一的最長公共子序列。這便啟示我們可能存在最優(yōu)子結(jié)構(gòu)和重疊子問題,可以采用動態(tài)規(guī)劃進(jìn)行求解。
2.1 分析問題結(jié)構(gòu)
形式化給出問題表示:
- C [ i , j ] C[i,j] C[i,j]: X [ 1.. i ] X[1..i] X[1..i]和 Y [ 1.. j ] Y[1..j] Y[1..j]的最長公共子序列長度
明確原始問題:
- C [ n , m ] C[n,m] C[n,m]: X [ 1.. n ] X[1..n] X[1..n]和 Y [ 1.. m ] Y[1..m] Y[1..m]的最長公共子序列長度
2.2 建立遞推關(guān)系
對于給定序列:
對于末尾來說,有兩種情況:
① x i = y j x_i=y_j xi?=yj?
此時,
C
[
i
,
j
]
=
m
a
x
{
C
[
i
?
1
,
j
?
1
]
+
1
①
C
[
i
?
1
,
j
]
②
C
[
i
,
j
?
1
]
③
C[i,j]=max\left\{\begin{matrix} C[i-1,j-1]+1 & ①\\ C[i-1,j] & ②\\ C[i,j-1] &③ \end{matrix}\right.
C[i,j]=max?
?
??C[i?1,j?1]+1C[i?1,j]C[i,j?1]?①②③?
但是,
①
≥
m
a
x
{
②,③
}
{①\ge max\left \{ ②,③ \right \} }
①≥max{②,③},因此,
C
[
i
,
j
]
=
C
[
i
?
1
,
j
?
1
]
+
1
C[i,j]=C[i-1,j-1]+1
C[i,j]=C[i?1,j?1]+1
② x i ≠ y j x_i \ne y_j xi?=yj?
此時,
C
[
i
,
j
]
=
m
a
x
{
C
[
i
?
1
,
j
]
①
C
[
i
,
j
?
1
]
②
C[i,j]=max\left\{\begin{matrix} C[i-1,j] & ①\\ C[i,j-1] & ② \end{matrix}\right.
C[i,j]=max{C[i?1,j]C[i,j?1]?①②?
綜上所述,得到遞推關(guān)系式:
C
[
i
,
j
]
=
{
C
[
i
?
1
,
j
?
1
]
+
1
x
i
=
y
j
m
a
x
{
C
[
i
?
1
,
j
]
,
C
[
i
,
j
?
1
]
}
x
i
≠
y
j
C[i,j]=\left\{\begin{matrix} C[i-1,j-1]+1 & x_i=y_j\\ max\left\{ C[i-1,j],\\ C[i,j-1] \right\} & x_i\ne y_j\\ \end{matrix}\right.
C[i,j]={C[i?1,j?1]+1max{C[i?1,j],C[i,j?1]}?xi?=yj?xi?=yj??
2.3 自底向上計算
(1)初始化
當(dāng)其中一段序列長度為0時,最長公共子序列長度為0,即: C [ i , 0 ] = C [ 0 , j ] = 0 C[i,0]=C[0,j]=0 C[i,0]=C[0,j]=0
(2)依照遞推公式計算
2.4 追蹤最優(yōu)方案
構(gòu)造追蹤數(shù)組
r
e
c
[
1..
n
]
rec[1..n]
rec[1..n],用來記錄子問題的來源:
r
e
c
[
i
,
j
]
=
{
L
U
i
f
C
[
i
,
j
]
=
C
[
i
?
1
,
j
?
1
]
+
1
U
i
f
C
[
i
,
j
]
=
C
[
i
?
1
,
j
]
L
i
f
C
[
i
,
j
]
=
C
[
i
,
j
?
1
]
rec[i,j]=\left\{\begin{matrix} LU & if\quad C[i,j]=C[i-1,j-1]+1\\ U & if\quad C[i,j]=C[i-1,j]\\ L & if\quad C[i,j]=C[i,j-1] \end{matrix}\right.
rec[i,j]=?
?
??LUUL?ifC[i,j]=C[i?1,j?1]+1ifC[i,j]=C[i?1,j]ifC[i,j]=C[i,j?1]?
(使用
U
U
U代表來自上方,
L
L
L代表來自左方,
L
U
LU
LU代表來自左上角)
當(dāng)左值和上值相等時,任取其一即可。
從右下角開始追蹤,如果其值為 L L L,則向左移動1格, U U U則向上移動一格, L U LU LU向左上角移動一格。當(dāng)且僅當(dāng) r e c [ i , j ] = L U rec[i,j]=LU rec[i,j]=LU時, X [ i ] = Y [ j ] X[i]=Y[j] X[i]=Y[j]為最長公共子序列中的一個字符,記錄下來。如此尋找,直至抵達(dá) r e c rec rec數(shù)組的邊界。
2.5 算法實例
給定序列 X X X和 Y Y Y:
初始化輔助數(shù)組:
計算完畢:
追蹤最優(yōu)方案:
得到最長公共子序列 B C B A BCBA BCBA
三、算法分析
3.1 偽代碼
文章來源:http://www.zghlxwxcb.cn/news/detail-743439.html
3.2 時間復(fù)雜度
時間復(fù)雜度 O ( n m ) O(nm) O(nm)文章來源地址http://www.zghlxwxcb.cn/news/detail-743439.html
到了這里,關(guān)于【動態(tài)規(guī)劃】最長公共子序列——算法設(shè)計與分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!