給定兩個序列x=
x1,x
2,x3
...,
xm和y=y
1,y2
,y3,
...,
yn,求x和y的最長公共子串行。
例子:x=注意:最長公共字串(longestcommonsubstring)要求元素必須連續,最長公共子串行不要求,只要求子串行前後順序不變。a,b,
c,b,
d,a,
b ,y=
b,d,
c,a,
b,a ,最長公共子串行為b,
c,b,
a 。
問題意義:一種衡量兩個序列「相似度」的方法,最長公共子串行越長,兩者相似度越高。1.暴力破解法:x的子串行共有2^m種,對於每一種x的子串行判斷是否為y的子集,y的子串行有2^m種,需要指數級別的時間複雜度o(2^(m+n))。補充:其他衡量兩個序列/串相似度的方法:
1.如果,將乙個串轉換成另乙個串的所需的操作步驟很少,那麼兩者是相似的;(《程式設計之美》字串距離;《演算法導論》15-5編輯距離)
2.如果乙個串為另乙個串的子串,那麼兩者是相似的。(字串匹配)
2.動態規劃法,時間複雜度o(m*n)。
定義:x=設計lcs的演算法首先要建立最優解的遞迴式。我們定義c[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。
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 時所選擇的子問題最優解。偽 如下 ...
演算法 最長公共子串行
好久沒做演算法題了,現在發現自己的演算法能力非常薄弱,所以特意練練,順便做個筆記方便以後檢視。今天整理一下最長公共子串行,最長公共子串行的問題常用於解決字串的相似度,是乙個非常實用的演算法,作為碼農,此演算法是我們的必備基本功。最長公共子串行,是指兩個字串可具有的長度最大的公共的子串行。聽著好像有點...