最長公共子串行(LCS)和最優二叉搜尋樹

2021-07-16 00:09:19 字數 2871 閱讀 2195

最長公共子串行-------

比較兩個串的相似度有這樣一種方法:尋找第三個串s3,它的所有序列也都出現在s1 和s2中,且在三個串中出現的次序都相同,但不要求連續出現,可以找到的s3越長就可以認為s1s2相似度越大, 這就是**最長公共子串行**

的問題形式化定義如下:

給定乙個序列x= ,另乙個序列z= 滿足如下條件時稱為x的子串行:存在乙個嚴格遞增的x的下表序列對所有j = 1,2,3..k滿足 xij = zj。

例如 z= 是x= b,c,b,d,a,b>的乙個子串行

給定兩個序列x和y,如果z既是x的子串行也是y的子串行,則為x和y的公共子串行

如x= b,c,b,d,a,b>,y= <b,a,c,f,d,b>,z= 是公共子串行

最長公共子串行問題:

給定兩個序列x,y求x和y長度最長的公共子串行(lcs問題)

s1:刻畫最長公共子串行

lcs問題具有最優子結構性質,子問題的自然分類對應兩個輸入序列的」字首」對;

字首的嚴謹定義是:給定乙個序列x= ,對i = 0,1,...,m定義x的第i字首為xi =

lcs的最優子結構:

令x = , y = 為兩個序列,z = 為x和y的任意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

s2:乙個遞迴解

要求解乙個或兩個子問題

如果xm = yn只要求xm-1 和yn-1的乙個lcs,然後把xm加到最後

如果不等,就要求兩個子問題xm-1和y的乙個lcs,x和yn-1的乙個lcs,找出比較長的乙個

先從遞迴的容易思考的角度去想

定義c[i , j]表示xi 和yj的lcs的長度,如果i = 0 || j = 0,那麼lcs長度肯定為0 ,可以得到:

0 i==0|| j==0

c[i , j] = c[i-1 , j-1]+1 i,j>0 && xi = yj

max(c[i, j-1], c[i-1 , j]) i,j>0&&xi!=yj

s3:計算lcs的長度

將遞迴思想用動態規劃實現

接受兩個序列為輸入,將c[i , j]的值儲存在表 c[0..m, 0..n]中,並按行主次序計算,過程還維護乙個**b[1..m, 1..n]幫助構造最優解 「x」為 x序列退一步的,『y』為y序列退一步的, 『d』表示兩者最後乙個一樣,遞迴找前面的

偽**如下:

```lcs(x,y)

else if(c[i-1, j]>= c[i, j-1])//x序列退乙個與當前y找的公共串長

else

}return c, b;

}```

s4:構造lcs

```print_lcs(b, x, i, j)

else if(b[i,j]=='x')print_lcs(b,x,i-1,j);

else print_lcs(b,x,i,j-1);

}```

起始呼叫是 (b, x, x.length, y.length)

最優二叉搜尋樹

-----------

給定乙個n個不同關鍵字的已排序的序列

k=,用這些關鍵字構造一顆二叉搜尋樹。對每個關鍵字ki都有乙個概率pi表示其搜尋頻率,有些要搜尋的值可能不在k中,因此還有n+1個「偽關鍵字」d0, d1,d2..dn,d0 表示小於k1的值, dn表示大於kn的值,偽關鍵字di表示所有在關鍵字ki ki+1之間的值,每個偽關鍵字也有對應的qi。通常ki是內部的點,di是葉節點

對一顆搜尋樹搜尋一次的期望為

e[t] = (depth(ki)+1)*pi(i = 1...n 的和)+ (depth(di)+1)*

qi(i = 0...n求和)

搜尋代價最小的樹就是最優二叉搜尋樹

s1:最優二叉搜尋樹的結構

一棵最優二叉樹包含的子樹必然是作為例項的最優結構

s2:乙個遞迴演算法

子問題域為求解包含關鍵字ki..kj的最優二叉搜尋樹,i>=1&& j>=i-1&&j<=n(j = i-1時子樹不包含實際關鍵字,只包含偽關鍵字)。定義e[i,j]為包含關鍵字ki..kj的最優二叉搜尋中進行一次搜尋的期望代價,最終希望計算出e[1,n]

j=i-1的情況最簡單,子樹只包含偽關鍵字di-1, e[i, i-1] = qi-1

j>=i時,需要從ki...kj中選擇乙個根節點kr,然後構造一顆包含ki...kr-1的最優二叉搜尋樹做左子樹,kr+1...kj的最優二叉搜尋樹做右子樹。

當一顆子樹成為乙個結點的子樹時,每個結點的深度都增加了1,期望搜尋代價的增加值應為所有概率之和

對於包含ki...kj的子樹,所有概率之和為 w(i,j) = (pl)(l從i到j)+ql(l從i-1到j)

因此,若kr為包含關鍵字ki...kj的最優二叉搜尋樹的根節點,

e[i,j] = pr + e[i,r-1]+w(i,r-1)+e[r+1,j]+w(r+1,j),又 w(i,j) = w(i,r-1)+pr+w(r+1,j)

所以e[i,j] = e[i, r-1]+e[r+1,j]+w(i,j)直觀上就是左子樹的右子樹的加上增量

qi-i j=i-1  

e[i,j] = 

min i<=j

s3:計算最優二叉搜尋回溯的期望搜尋代價

用 root[i,j]來記錄這個子樹的根

對j>=i w[i,j] = w[i, j-1]+pj+qj

偽**如下:

```optimal_bst(p,q,n)

for(l=1;l<=n;l++)

for(i=1;i<=n-l+1;i++)}}

}```

LCS 最長公共子串行

問題描述 我們稱序列z z1,z2,zk 是序列x x1,x2,xm 的子串行當且僅當存在嚴格上 公升的序列 i1,i2,ik 使得對 j 1,2,k,有 xij zj。比如z a,b,f,c 是 x a,b,c,f,b,c 的子串行。現在給出兩個序列 x和 y,你的任務是找到 x和 y的最大公共子...

LCS最長公共子串行

求兩個字串的最大公共子串行問題 子串行的定義 若給定序列x 則另一串行z 是x的子串行是指存在乙個嚴格遞增下標序列使得對於所有j 1,2,k有 zj xij。例如,序列z 是序列x 的子序列,相應的遞增下標序列為。分析 用動態規劃做 1.最長公共子串行的結構 事實上,最長公共子串行問題具有最優子結構...

LCS最長公共子串行

lcs是longest common subsequence的縮寫,即最長公共子串行。乙個序列,如果是兩個或多個已知序列的子串行,且是所有子串行中最長的,則為最長公共子串行。複雜度對於一般的lcs問題,都屬於np問題。當數列的量為一定的時,都可以採用動態規劃去解決。解法動態規劃的乙個計算最長公共子串...