一、演算法設計與分析:
設計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 的子串行...