動態規劃 編輯距離

2021-09-24 13:43:30 字數 1192 閱讀 9949

給定兩個序列x和y,求從乙個序列到另乙個序列所需變換的最小次數,這裡的變換包括刪除,新增和替換,每次只對乙個元素進行操作。

演算法序言

這個題目有點像之前寫的最長公共子串行問題,也是用動態規劃的演算法。能夠應用動態規劃的題目有乙個特點就是具有最優子結構,就是整個問題的最優解會包含子問題的最優解,那麼我們求出所有子問題的最優解,最後就可以得到整個問題的最優解。

演算法核心

這個問題也是先求出和,,…,和,,…的編輯距離,然後根據遞推公式得到x和y的編輯距離。

a,b:兩個待比較序列;

a(i):表示取a序列前面長度為i的部分,b(j)同理;

i:序列a的下標;

j:序列b的下標;

c[i][j]:儲存a[:i]和b[:j]的編輯距離;

dif:如果a[i]==b[j],則dif=0;否則dif=1;

其中最重要的還是遞推公式:

c[i][j]=min;

下面來解釋一下這個遞推公式,對序列進行變換無非就是刪除,增加和替換。 首先說刪除,就是b中有這個元素但是a中沒有,就要在a中刪除,是在原來c[i-1][j]的基礎上增加了乙個刪除操作變為c[i-1][j]+1,證明用反證法,s為a(i)和b(j)的編輯距離,假設s』=s-1不是a(i-1)和b(j)的編輯距離,那麼a(i-1)和b(j)一定存在更小的編輯距離t』,在加上乙個刪除操作t=t』=1就是a(i)和b(j)的編輯距離,可知t演算法流程

先建立c陣列儲存子問題的最優解,在初始化的時候要注意一下,和最長公共子串行問題是不一樣的,這裡是第一行的每一列都初始化為行號,第一列的每一行也是初始化為列號,可以這樣理解,就是a序列為空的時候,另乙個序列長度為多少就有多少的編輯距離。然後設雙重迴圈用遞推公式求子問題的最優解,也就是各個子串行的編輯距離,最後就可以得到兩個完整序列的編輯距離。(如果想要得到究竟是怎麼操作的,可以設乙個陣列記錄每次操作,然後回溯即可;也可以不另設陣列直接回溯,根據值來找到當前解的**。)

#includeusing namespace std;

const int maxn=105;

int c[maxn][maxn];//存放子問題的最優解

string a,b;

int m,n;//a,b的長度

int min_(int a,int b,int c)

void editdis()

}int main()

動態規劃 編輯距離

1.實踐題目 編輯距離 2.問題描述 設a和b是2個字串。要用最少的字元操作將字串a轉換為字串b。這裡所說的字元操作包括 1 刪除乙個字元 2 插入乙個字元 3 將乙個字元改為另乙個字元。將字串a變換為字串b所用的最少字元運算元稱為字串a到 b的編輯距離,記為d a,b 對於給定的字串a和字串b,計...

動態規劃 編輯距離

將乙個字串變為另乙個字串最小操作次數,您對單詞允許以下3種操作 a 插入字元 b 刪除字元 c 替換字元 例如 a horse 變成 b ros 想法 coding utf 8 def char array replace array1,array2 row len array1 col len a...

動態規劃 編輯距離

求解編輯距離問題 一.演算法設計 這是一道經典的動態規劃問題,兩個字串的對齊方式很多,如果要將所有的對齊方式都考慮一遍,演算法的效率將十分低下。分解子問題的辦法是看兩個字串的字首,現令e i,j 表示字串x與字串y的相應字首的編輯距離,則e n,m 就是所求的答案。對於三種編輯操作的變化,對於e i...