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

2021-07-27 04:41:39 字數 2664 閱讀 7510

一、演算法設計與分析:

設計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]時所選擇的子問題最優解。偽**如下:

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 j=0 to n

c[0,j]=0;

for i=1 to n

for j=1 to n

ifx[i]==y[j]

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

b[i,j]=』y』;

else

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

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

b[i,j]=』u』;

else

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

b[i,j]=』l』;

return c and b;

二、演算法實現

#include#include #define maxx 1000

#define maxy 1000

#includeusing namespace std;

int lcs_length(char x, char y, int **c, char **b);

void print_lcs(char **b, char x, int i, int j);//遞迴

void print_lcs2(char **b, char x, int i, int j);//非遞迴

int main()

char **b = new char*[maxx+1];

for (int i = 0; i <=maxx; i++)

char ch;

//char x = ;

//char y = ;

char *x = new char[maxx + 1];

char *y = new char[maxx + 1];

x[0] = '0'; y[0] = '0';

for (int i = 1; i <=maxx; i++)

for (int j = 1; j <= maxy; j++)

len=lcs_length(x,y,c,b);

cout << "lcs長度為:"<< len << endl;

cout << "乙個lcs為:";

//print_lcs(b, x, maxx, maxy);//遞迴輸出,資料量大時遞迴棧溢位

print_lcs2(b, x, maxx, maxy);//迭代輸出

cout << endl;

return 0;

}int lcs_length(char x, char y, int** c, char **b)

for (j = 0; j <= maxy; j++)

for (i = 1; i <= maxx; i++)

else

else

}} }

return c[maxx][maxy];

}//遞迴輸出

void print_lcs(char **b, char x,int i, int j)

else

else

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

//非遞迴輸出

void print_lcs2(char **b, char x, int i, int j)

else

else

} }while (!lcs.empty())

}

三、演算法結果分析

首先採用演算法導論書上例子進行測試:即x=,y=

程式執行結果如下:

可見執行結果與預期一致。

'a'+rand()%26隨機生成兩個10000個字母的序列,執行結果如下:

四、總結

該演算法採用自底向上的動態規劃演算法,時間複雜度為o(mn),空間複雜度為也為o(mn),如果採用兩個二維陣列儲存b和c,當序列較大時出現棧溢位的問題,所以採取在堆上分配二維陣列空間的辦法以處理較大的資料量。

當資料量比較大時遞迴的輸出方法將會出現棧溢位問題,所以採取非遞迴的輸出演算法。

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

華電北風吹 日期 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...

演算法 最長公共子串行

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

演算法 最長公共子串行

題目 給定兩個字串 text1 和 text2,返回這兩個字串的最長公共子串行的長度。乙個字串的 子串行 是指這樣乙個新的字串 它是由原字串在不改變字元的相對順序的情況下刪除某些字元 也可以不刪除任何字元 後組成的新字串。例如,ace 是 abcde 的子串行,但 aec 不是 abcde 的子串行...