動態規劃之最長公共子串行(LCS)

2021-10-02 07:07:54 字數 2249 閱讀 8278

動態規劃法(dynamic programming)通常用於求解最優化問題(optimization problem),它適用於最優子結構和重疊子問題。這顯然與分治法是不同的,分治法將問題劃分為不重疊的子問題,然後分別求解這些子問題,最後將這些問題合併得到最終的解。

對於具有公共子問題的情況,分治法會做很多不必要的工作,它會多次求解同一子子問題。動態規劃法卻不一樣,對每個子子問題它只會求解一次,將其儲存在乙個**中,避免了不必要的重複計算。

如之前所說,動態規劃法用於求解最優化問題,這就意味著可能這個問題,有很多解,但是呢,不一定都是最優解。利用動態規劃法求出來的是這個問題的乙個最優解(an optimal solution),記住這裡求解的只是最優解(the optimal solution)中的乙個,因為最優解可能有多個。

設計乙個問題的動態規劃演算法主要有一下的幾步

(1)       找出最優解的性質,刻畫其結構特徵;

(2)       遞迴的定義最優解的值;

(3)       以自底向上的方式計算出最優值;

(4)       根據計算最優解時得到的資訊,構造乙個最優解。

最長公共子串行(longest-common-subsequence, lcs)

(1)子串行:乙個序列x = x1x2...xn,中任意刪除若干項,剩餘的序列叫做a的乙個子串行。也可以認為是從序列a按原順序保留任意若干項得到的序列。

例如:對序列 1,3,5,4,2,6,8,7來說,序列3,4,8,7 是它的乙個子串行。對於乙個長度為n的序列,它一共有2^n 個子序列,有(2^n – 1)個非空子序列。在這裡需要提醒大家,子串行不是子集,它和原始序列的元素順序是相關的。

(2)公共子串行:如果序列z既是序列x的子串行,同時也是序列y的子串行,則稱它為序列x和序列y的公共子串行。空序列是任何兩個序列的公共子串行。

(3)最長公共子串行:x和y的公共子串行中長度最長的(包含元素最多的)叫做x和y的最長公共子串行。

這個問題如果用窮舉法時間,最終求出最長公共子串行時,時間複雜度是ο(2mn),是指數級別的複雜度,對於長序列是不適用的。因此我們使用動態規劃法來求解。

第一步:刻畫最長公共子串行問題的最優子結構

設x=x1x2…xm和y=y1y2…yn是兩個序列,z=z1z2…zk是這兩個序列的乙個最長公共子串行。

1.      如果xm=yn,那麼zk=xm=yn,且zk-1是xm-1,yn-1的乙個最長公共子串行;

2.      如果xm≠yn,那麼zk≠xm,意味著z是xm-1,y的乙個最長公共子串行;

3.      如果xm≠yn,那麼zk≠yn,意味著z是x,yn-1的乙個最長公共子串行。

第二步:遞迴的定義最優值

從最優子結構可以看出,如果xm=yn,那麼我們應該求解xm-1,yn-1的乙個lcs,並且將xm=yn加入到這個lcs的末尾,這樣得到的乙個新的lcs就是所求。

如果xm≠yn,我們需要求解兩個子問題,分別求xm-1,y的乙個lcs和x,yn-1的乙個lcs。兩個lcs中較長者就是x和y的乙個lcs。

可以看出lcs問題具有重疊子問題性質。為了求x和y的乙個lcs,我們需要分別求出xm-1,y的乙個lcs和x,yn-1的乙個lcs,這幾個字問題又包含了求出xm-1,yn-1的乙個lcs的子子問題。(有點繞了。。。暈沒暈。。。。)

根據上面的分析,我們可以得出下面的公式:

計算最優值

public class main ;

char y = ;

int t=lccslength(x, y);

system.out.println(t);

}public static int lccslength(char x, char y)

for(int j=1;j<=y.length;j++)

/* 如果是 for(int i=1;i=dp[i][j+1])else

if(x[i]==y[j])else}}

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

system.out.println();

}return dp[x.length][y.length];}}

構造最優解

動態規劃之最長公共子串行(lcs)

最長公共子串行的定義是,乙個數列z分別是已知數列的子串行 子串行不一定是連續序列,是在該序列中刪去若干元素後得到的序列 且是所有符合此條件序列中最長的,則z成為最長公共子串行lcs longest common subsequences 有些地方則說公共子串就是要求連續的子串行,有些地方則不是,這裡...

動態規劃之 最長公共子串行 LCS

這個問題是動態規劃演算法中的乙個經典問題,先看問題描述 lcs 兩個字串 x和 y,找到他們最長的公共子串行,該序列不要求是連續的。公共子串行的意思就是序列的相對順序是不變的,但是序列不一定是連續的。例如 x bdcaba y abcbdab 他們的最長公共子串行是bcba和bdab,長度都為4,找...

動態規劃之最長公共子串行(LCS)

動態規劃之最長公共子串行問題 前言 乙個給定序列的子串行,就是將給定的序列中零個或多個元素去掉後得到的結果。其形式化定義如下 給定乙個序列x 另乙個序列z 滿足如下條件時稱為x的子串行,即存在乙個嚴格遞增的x下表序列 i1,i2 ik 對所有j 1,2,3,k滿足xi zj例如z 是x 的子串行對應...