《演算法導論》學習筆記 最長公共子串行(動態規劃)

2021-07-02 05:37:46 字數 2770 閱讀 8401

給定兩個序列x=

x1,x

2,x3

...,

xm和y=y

1,y2

,y3,

...,

yn,求x和y的最長公共子串行。

例子:x=

a,b,

c,b,

d,a,

b ,y=

b,d,

c,a,

b,a ,最長公共子串行為b,

c,b,

a 。

注意:最長公共字串(longestcommonsubstring)要求元素必須連續,最長公共子串行不要求,只要求子串行前後順序不變。

問題意義:一種衡量兩個序列「相似度」的方法,最長公共子串行越長,兩者相似度越高。

補充:其他衡量兩個序列/串相似度的方法:

1.如果,將乙個串轉換成另乙個串的所需的操作步驟很少,那麼兩者是相似的;(《程式設計之美》字串距離;《演算法導論》15-5編輯距離)

2.如果乙個串為另乙個串的子串,那麼兩者是相似的。(字串匹配)

1.暴力破解法:x的子串行共有2^m種,對於每一種x的子串行判斷是否為y的子集,y的子串行有2^m種,需要指數級別的時間複雜度o(2^(m+n))。

2.動態規劃法,時間複雜度o(m*n)。

定義:x=

x1,x

2,x3

...,

xm的第i個字首為xi

=x1,

x2,x

3...

,xi (i<=m,i=0的xi為空串) 令x

=x1,

x2,x

3...

,xm 和y=

y1,y

2,y3

,...

,yn 為兩個序列,z=

z1,z

2,z3

,...

,zk 為

x 和

y的任意lcs。

lcs的最優子結構:

1.如果xm

=yn ,則zk

=xm=

yn且zk

−1是xm

−1和yn

−1的乙個lcs。

2.如果xm

≠yn ,那麼zk

≠xm 意味著

z 是xm

−1和y

的乙個lcs。

3.如果xm

≠yn,那麼zk

≠yn 意味著

z 是x和

yn−1

的乙個lcs。

設計lcs的演算法首先要建立最優解的遞迴式。我們定義c[

i,j]

表示xi

和yj 的lcs的長度,根據lcs問題的最優子結構性質,可得到如下公式: c[

i,j]

=0,若

i=0或

j=0

c[i,

j]=c

[i−1

,j−1

]+1,

若i,j

>0且

xi=y

j c[

i,j]

=max

(c[i

−1,j

],c[

i,j−

1]),

若i,j

>0且

xi≠y

j lcs問題只有o(m*n)個不同的子問題,可以用自底向上的動態規劃演算法實現。

表b用於構造最優解,表c用於用於記錄lcs長度,偽**如下:

lcs-length(x,y)

m = x.length

n = y.length

let b[1...m,1..n] and c[0...m,0...n] be new tables

for i = 1

to m

c[i,0] = 0

for i = 1

to n

c[0,i] = 0

for i = 1

to m

for j = 1

to n

if xi = yj

c[i,j] = c[i-1,j-1] + 1

b[i,j] = '↖'

elseif c[i-1,j] >= c[i,j-1]

c[i,j] = c[i-1,j]

b[i,j] = '↑'

else

c[i,j] = c[i,j-1]

b[i,j] = '←'

return b and c

利用表b構造出最優解,起始呼叫為print-lcs(b,x,x.length,y.length)

偽**如下:

print-lcs(b,x,i,j)

ifi == 0 or j == 0

return

elseif b[i,j] == '↖'

print-lcs(b,x,i-1,j-1)

print xi

elseif b[i,j] == '↑'

print-lcs(b,x,i-1,j)

else

print-lcs(b,x,i,j-1)

1.去除表b,只利用c重構出lcs的元素。

2.如果只計算lcs的長度,不需重構lcs中的元素,那麼c表只需要兩行就可以了,空間需求減少為o(min(m,n))。

演算法導論 最長公共子串行

華電北風吹 日期 2016 2 24 問題描述 給定兩個序列x x1,x2,x m 和y y1,y 2,yn 求 x 和 y的長度最長的公共子串行。子串行 給定乙個序列x x1,x2,x m 若另乙個序列z z1,z2,z k 滿足存在乙個嚴格遞增的下標序列i1 i2,ik使得對所有的j 1,2,k...

演算法導論 最長公共子串行

一 演算法設計與分析 設計lcs length演算法,概算福接受兩個序列x 1.m y 1.n 為輸入。它將c i,j 的值儲存在表c 0 m,0 n 並按照行主序計算表項。過程維護乙個表b 1 m,1 n 幫助構造最優解。b i,j 指向的表項對應計算c i,j 時所選擇的子問題最優解。偽 如下 ...

演算法 最長公共子串行

好久沒做演算法題了,現在發現自己的演算法能力非常薄弱,所以特意練練,順便做個筆記方便以後檢視。今天整理一下最長公共子串行,最長公共子串行的問題常用於解決字串的相似度,是乙個非常實用的演算法,作為碼農,此演算法是我們的必備基本功。最長公共子串行,是指兩個字串可具有的長度最大的公共的子串行。聽著好像有點...