1. 程式人生 > >演算法導論 15-3 編輯距離

演算法導論 15-3 編輯距離

題目概述

有六種操作,分別是複製(copy)、替換(replace)、刪除(delete)、插入(insert)、交換(twiddle)、消滅(kill)。
將這六種操作任意組合(可以重複或者沒有)得到一個操作序列。
操作序列的輸入是一個字串,操作的輸出是另一個字串。
例如字串algorithm,經過以下操作序列,得到字串altruistic。

一個字串src,變成另一個字串dst,可以很多種方法。
題目要求對於給定的src和dst,找到一種最優的操作序列,包含最少的操作個數,使src變成dst。輸出這個操作序列。操作序列中操作的個數就是src到dst的編輯距離。

下面具體解釋這六種操作的內容即i和j的含義:
i是src的下標,j是dst的下標。操作開始前,i = j = 0。
令x為任意的字元
copy: dst[j] = src[i], i++, j++
replace: dst[j] = x, i++, j++
delete: i++
insert: dst[j] = x, j++
twiddle: dst[j] = src[i+1], dst[j+1] = src[i], i += 2, j += 2
kill: 消滅src中剩下的字元。如果執行這個操作,則它必是最的操作。

思考

對於DP問題,首先要想清楚的是初始化過遞推。題目中i和j的遞增給了很好的提示。
定義c[i,j]為src的子串src[0,i]變化為dst的子串dst[0,j]的過程的編輯距離。
那麼c[src.length(), dst.length()]即src到dst的編輯距離。
這裡只是希望操作的個數最少,在操作個數相同的情況下,用什麼操作是沒有差別的,即每個操作的代價是一樣的,即cost(operation) = 1

(1)初始化

c[0,0]=0
c[i,0] = i * cost(delete)
c[0,j] = j * cost(insert)

(2)遞推

令c[i, j] = a,根據每個operation的規則,有以下推理

copy: dst[j] = src[i], i++, j++ ==> c[i+1, j+1] = a + cost(copy)
replace: dst[j] = x, i++, j++  ==> c[i+1, j+1] = a + cost(replace)
delete: i++ ==>  c[i+1, j] = a + cost(delete) 
insert: dst[j] = x, j++  ==> c[i, j+1] = a + cost(insert)
twiddle: dst[j] = src[i+1], dst[j+1] = src[i], i += 2, j += 2  ==> c[i+2, j+2] = a + cost(twiddle)
kill: 消滅src中剩下的字元。如果執行這個操作,則它必是最的操作。

(3)反推

以上推理是基於現在的結果預測後面的結果。
然後現在的結果並不能決定後面的結果,但現在的結果一定來自於前面的結果。
因此要轉換思考方向,將遞推進行反推,這一步是DP的難點。

(4)最後的操作kill

c[i][j] = MIN(c[m,n], MIN(c[i,n]+cost(kill))), 其中0<=i

程式碼

原始碼

DNA對齊問題

DNA對齊問題可以看作是帶權值的編輯距離問題。
在編輯距離問題中,所有的操作都看作是一樣,即cost(operation) = 1
現在把其中一操作加上權值,求最小值改成求最大值,就是DNA對齊問題了。

copy : 1
replace : -1
insert : -2
delete : 去掉
twiddle : 去掉
kill : 去掉

原題




相關推薦

演算法導論 15-3 編輯距離

題目概述 有六種操作,分別是複製(copy)、替換(replace)、刪除(delete)、插入(insert)、交換(twiddle)、消滅(kill)。 將這六種操作任意組合(可以重複或者沒有)得到一個操作序列。 操作序列的輸入是一個字串,操作的輸出是

演算法導論-15-3-編輯距離

題目: 思考: (1)初始化: s[0,0]=0 s[i,0] = i * cost(delete) s[0,j] = j * cost[insert] (2)遞推 (3)最後的操作kill c[i][j] = MIN(c[m,n], MIN(c[i,n]+cos

演算法導論3.1~3.2

2018年10月31日 19:42:50 mahaoyuan2015 閱讀數:4 個人分類: 讀書筆記

演算法導論15.1 鋼條切割

筆記        本節給出一個尋找鋼條最優切割方案的問題。公司購買長鋼條,將其切割為短鋼條出售。為簡化分析,假設切割過程本身沒有成本,並且切割下來的短鋼條長度都為一英寸的整數倍。下表給出了不同長度的鋼條的價格。        鋼條切割問題:給定一根長度為n英寸的長鋼

演算法】樹的編輯距離

    字串編輯距離定義了一個從字串轉換到另一個字串最少需要的操作次數,操作次數越少,則從側面證明兩個字串較為相似,它從新的角度定義了兩個事物相似度的計算方法,這種事物並不僅限於字串,也可以是其他結構比如樹。樹的編輯操作同樣有三種:1.插入:向一顆樹中插入一個節點;2.刪除:

演算法導論 5.3-4

Armstrong教授建議使用下列過程來產生均勻隨機排列:PERMUTE-BY-CYCLIC(A)1 n <- length[A]2 offset <- RANDOM(1,n)3 for i <- 1 to n4 do dest <- i + offset5 if dest >

演算法導論 4.3-1

a) a=4,b=2,f(n)=n,nlogb a=n2; f(n)=O(n2- ε ),T(n)=Θ(n2); b) a=4,b=2,f(n)=n2,nlogb a=n2; f(n)=Θ(n2),T(n)=Θ(n2 lgn); c) a=4,b=2,f(n)=n3,nlogb a=n2; f(n) = Ω

演算法導論15章 動態規劃之矩陣鏈乘法問題

陣鏈乘法問題: 給定一個n個矩陣的序列(矩陣鏈)<A1, A2, A3, .……, An>,矩陣Ai的規模為Pi-1 * Pi, 求完全括號話方案,使得計算成績A1*A2*......*An所需標量乘法次數最少。 注意:求解矩陣鏈乘法問題並不是要真正進行矩陣相乘

演算法導論14.3區間樹 練習總結

14.3-1 寫出作用於區間樹的結點且在 O(1) 時間內更新 max 屬性的過程 LEFT-ROTATE 的虛擬碼。 ANSWER: 虛擬碼: LEFT-ROTATE(T, x) y = x.right y.max = x.max x.max =

演算法導論 8-3思考題 之變長資料項的排序

題目 給定一個整數陣列,其中不同的整數所包含的數字的位數可能不同,但該陣列中,所有整數中包含的總數字為n。設計一個演算法,使其可以在O(n)時間內對該陣列進行排序。 演算法思路 首先,我們可以用計數排序按數字的位數進行排序。然後,用基數排序來對每組

演算法導論程式3--最大子陣列問題(Python)

尋找最大子陣列問題: 給定陣列A:尋找A中的和最大的非連續子陣列。我們稱這樣的連續子陣列為最大子陣列(maximum subarray) 使用分治策略的求解方法: 假定我們要尋找子陣列A[low...high]的最大子陣列。使用分治技術意味著我們要將子陣列劃分為兩個規模儘量

演算法介紹(3編輯距離演算法-字串相似度

           編輯距離,又稱Levenshtein距離,是指兩個字串之間,由一個轉成另一個所需的最少編輯操作次數。        具體的操作方法為:     

Appium react@~15.3.1 編輯記錄

appium react@~15.3.1\ npm install -save react@~15.3.1npm WARN checkPermissions Missing write access to /usr/local/lib/node_modules/appium/node_modules/_app

[python]My Unique JsonDiff演算法——如何計算2個json串之間的差距並Diff出來(一):編輯距離(Levenshtein)演算法

    啊啊,年底忙著簽證什麼的,好久沒寫日誌啦。。。。新年到來,整點乾貨出來給大家~~順便為自己考試和申請學校攢點人品~~     之前實習的時候,因為實習公司的業務需求,需要一個比對json字串差異的演算法,然而我在網上查了很久的資料,發現竟然沒有現成

二叉搜尋樹增刪節點《演算法導論》12.3

向二叉搜尋樹增加一個節點是比較簡單的,每個新節點都會成為樹上的新葉子,我們要做的是從根開始,沿著一條路徑,抵達安放新葉子的正確位置。這條路徑是怎樣找到的呢? 路徑的起點自然是根節點了,把起點作為當前節點,和新節點比較大小,如果新節點較小,那麼新節點應該屬於當前節點的左子樹,於是選擇當前節點的左孩子作為新

演算法導論》12.3節習題

12.3-1 二叉搜尋樹insert操作的遞迴版本 void insert1(Node* pRoot, Node* pAdd) { bool bLeft = pAdd->key < pRoot->key; Node* pNextRoot = bLeft ? pRo

動態規劃之鋼條切割問題,《演算法導論15.1

動態規劃(dynamic programming),是一種解決問題的方法,它的思路是將大問題分解為子問題,然後合併子問題的解。與分治法將問題分解為彼此獨立的子問題不同,動態規劃應用於子問題相互重疊的情況。為了避免這些重疊部分(即子子問題)被重複計算,動態規劃演算法對每個子子問題只計算一次,並記錄在一個表

大學計算機——計算思維導論3章 問題求解框架 3.2 演算法類問題求解框架 課後作業

1、演算法就是一個有窮規則的集合,其中之規則規定了解決某一特定型別問題的一個運算序列。回答下列問題。 (1)關於演算法的特性,下列說法不正確的是_____。 (A)演算法必須有明確的結束條件,即演算法應該能夠結束,此即演算法的有窮性;√ (B)演算法的步驟必須要確切地定義,不能有歧義性,此即演算法的確定

編輯距離演算法詳解:Levenshtein Distance演算法——動態規劃問題

目錄 背景: 求編輯距離演算法: 圖解過程: C++程式碼如下: 總結: 背景: 我們在使用詞典app時,有沒有發現即使輸錯幾個字母,app依然能給我們推薦出想要的單詞,非常智慧。它是怎麼找出我們想要的單詞的呢?這裡就需要BK樹來解決這個問題了。在使用BK樹

編輯距離演算法Java實現

/** * 計算編輯距離Edit Distance * if i == 0 且 j == 0,edit(i, j) = 0 * if i == 0 且 j > 0,edit(i, j) = j * if i > 0 且j == 0,edit(i,