[DP] 2種編輯距離(Damerau/Levenshtein Distance)

做完這題覺得必須得來個解題報告了,這題的動態(tài)規(guī)劃有點(diǎn)酸爽啊~

問題如下:

編輯距離,又稱Levenshtein距離,是指兩個字串之間图云,由一個轉(zhuǎn)成另一個所需的最少編輯操作次數(shù)。許可的編輯操作包括將一個字符替換成另一個字符,插入一個字符震桶,刪除一個字符。

以上的問題可以用眾所周知的動態(tài)規(guī)劃解決征绎,現(xiàn)在的問題是蹲姐,如果新加入一種編輯操作:交換相鄰的兩個字符;求兩個字符串之間的編輯距離人柿。

輸入為2個字符串(長度小于1000)柴墩,輸出為兩個串的編輯距離。

L氏距離(Levenshtein Distance)

基礎(chǔ)的編輯距離只有3種原子操作:插入1個字符顷扩,刪除1個字符拐邪,更改1個字符.且3種操作的代價均為1.
設(shè)串A為a1 a2 ... am, 串B為b1 b2 ... bn
將串A經(jīng)過n個操作x1 - x2 - ... - xn,使之變成串B隘截,且該操作序列為最優(yōu)操作(代價之和最性住)的一種,則2個串的L氏距離即為該序列代價之和婶芭。通常3個操作的代價都為1,也有可能按某種方案加權(quán)(即3種操作的代價不一致东臀,導(dǎo)致更復(fù)雜的情況,這里只討論都是1的).

2個串的距離(這里cost_of_xi都為1)

這種編輯距離可以很直觀地用DP得到:(同時網(wǎng)絡(luò)上的中文資料大部分都為這種距離)

用C[i,j]表示a1 a2 ... aib1 b2 ... bj的距離犀农,則有以下狀態(tài)轉(zhuǎn)移方程:

C[i,j]

cost

上面的轉(zhuǎn)移方程是很直觀的惰赋,有人會問這樣每次只考慮對于兩個串的最后一個元素的操作是否會錯過最優(yōu)解,這個可以通過歸納法證明此種求解方法得到的就是最優(yōu)解呵哨。
每個C[i,j]都由下標(biāo)嚴(yán)格小于i和j的元素C[i-1,j-1]/C[i-1,j]/C[i,j-1]決定赁濒。
算法流程即為從左到右,從上到下遍歷矩陣C孟害,最后的整個串的L氏距離值為C[m,n]拒炎。

L氏距離有一些性質(zhì),這里不具體展開了...(-. -!)

D氏距離

<b>1.引子</b>
上面講了那么多挨务,然而并沒有什么卵用击你。
題目中增加了transposition操作玉组,可以交換2個相鄰元素,并且這個操作的代價也是1.那么問題來了丁侄,原先的狀態(tài)轉(zhuǎn)移方程需要如果改變呢惯雳?
最開始我的思路是這樣的,直覺+觀察發(fā)現(xiàn)對于原先方程中的第三個式子鸿摇,在某些條件下石景,若用交換代替原來的操作,可以使總代價減少1:
當(dāng)ai != bjai-1 != bj-1時:可能通過subs(修改最后一個元素)户辱,從而C[i,j]可能是C[i-1,j-1]+1(也可能是另外2個操作)
若同時ai-1 = bjai = bj-1鸵钝,則只需交換最后2個元素即可,則該操作代價應(yīng)比subs少1,從而可排除此輪subs的操作在最優(yōu)操作序列中的可能性庐镐。

<b>2. 2種鏡像操作</b>
這里觀察發(fā)現(xiàn)的交換實(shí)際上只是相鄰2個字符交換的情況恩商,推廣到一般情況,很可能會有如下的操作:

  1. 交換2個相鄰字符必逆,并在其之間插入字符怠堪。
  2. 刪除某2個不相鄰字符之間的所有字符,并使之交換名眉。
    這2種操作很有可能比原來的代價要低粟矿。

<b>3. 嚴(yán)格編輯距離與D氏距離</b>
另外這里還需要引入另一個概念,所謂嚴(yán)格編輯距離损拢,這個的意思是每次操作只能改變串A的一個位置(最后一個位置)陌粹,嚴(yán)格定義見wiki:optimal string alignment[citation needed] (sometimes called the restricted edit distance[citation needed]
), 我個人理解就是不能往中間插入,每次只能更改串的最后一個字符(或者加入新字符或者刪改原串中的最后一個字符)福压。
這里給了一個例子掏秩,AC 和 CBA 的距離,若是嚴(yán)格編輯距離為4荆姆,則操作為:AC - CA - CB - CBA(或其他)蒙幻;若是D氏距離則為3,操作為AC - CA - CBA,對于刪除同理胆筒。
本題中的“距離”應(yīng)該指的是后者邮破。

<b>4. 最優(yōu)子結(jié)構(gòu)性質(zhì)</b>
L氏距離的DP求解有個性質(zhì),就是某個步驟中的操作一旦被認(rèn)為是最優(yōu)的仆救,則后續(xù)的操作不會再對前面的串再做更改(再更改會使總代價變高)抒和。即存在最優(yōu)子結(jié)構(gòu)。
那D氏距離是否存在最優(yōu)子結(jié)構(gòu)呢彤蔽?
實(shí)際上有個結(jié)論构诚,當(dāng)trans的代價大于等于插入和刪除代價和一半時,trans交換過的元素不會再被更改(Wiki - there always exists an optimal sequence of edit operations, where once-transposed letters are never modified afterwards. (This holds as long as the cost of a transposition,

W_T
W_T
, is at least the average of the cost of an insertion and deletion, i.e.,
2W_T \ge W_I+W_D
2W_T \ge W_I+W_D
.[8]
) )

<b>5. 狀態(tài)轉(zhuǎn)移方程</b>
結(jié)合上面幾點(diǎn)铆惑,開了開腦洞范嘱,我想出了這樣的方程

New C[i,j]

k1和k2

其中,k1和k2一開始我的想法是只要能滿足的交換條件的都去遍歷一遍员魏,實(shí)際上只需要計(jì)算距離當(dāng)前i丑蛤,j最近的一次"交叉相等"即可.(即滿足交叉相等的2個下標(biāo)盡可能大)
由于交換需要的條件是相鄰,因此撕阎,該操作需要先刪除串A中本來存在k1 .. i之間的所有元素受裹,并且在交換k1 .. i之后插入所有B中相應(yīng)的元素,因此就有后面那堆i虏束,k1棉饶,j,k2的運(yùn)算镇匀。
為什么是最“近”呢照藻?
假設(shè)存在一個比較“遠(yuǎn)”的k3/k4滿足交換條件,即A[k3] = B[j] & A[i] = B[k4],且有 k3 + k4 < k1 + k2汗侵。
這里就考慮A中的元素 A[k3+1 .. k1-1]和 B中的 B[k4+1 .. k2-1]幸缕,相信你已經(jīng)想到了,比較近的方案中晰韵,這些元素都尋求最優(yōu)的操作发乔。而較遠(yuǎn)的方案中,采取的是刪除A中元素雪猪,插入B中元素栏尚,則必定大于或等于最優(yōu)操作。因此只需要選擇最“近”的方案即可只恨。

<b>6. 相信到這里就已經(jīng)可以寫出O(N*M)的算法了</b>
其中译仗,Wiki的算法最為簡潔(是Wiki頁面上的算法2)。
D-L距離

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末坤次,一起剝皮案震驚了整個濱河市古劲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缰猴,老刑警劉巖产艾,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異滑绒,居然都是意外死亡闷堡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門疑故,熙熙樓的掌柜王于貴愁眉苦臉地迎上來杠览,“玉大人,你說我怎么就攤上這事纵势□獍ⅲ” “怎么了管钳?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長软舌。 經(jīng)常有香客問我才漆,道長,這世上最難降的妖魔是什么佛点? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任醇滥,我火速辦了婚禮,結(jié)果婚禮上超营,老公的妹妹穿的比我還像新娘鸳玩。我一直安慰自己,他們只是感情好演闭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布不跟。 她就那樣靜靜地躺著,像睡著了一般船响。 火紅的嫁衣襯著肌膚如雪躬拢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天见间,我揣著相機(jī)與錄音聊闯,去河邊找鬼。 笑死米诉,一個胖子當(dāng)著我的面吹牛菱蔬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播史侣,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼拴泌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了惊橱?” 一聲冷哼從身側(cè)響起蚪腐,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎税朴,沒想到半個月后回季,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡正林,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年泡一,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片觅廓。...
    茶點(diǎn)故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡鼻忠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出杈绸,到底是詐尸還是另有隱情帖蔓,我是刑警寧澤矮瘟,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站塑娇,受9級特大地震影響芥永,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜钝吮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望板辽。 院中可真熱鬧奇瘦,春花似錦、人聲如沸劲弦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽邑跪。三九已至次坡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間画畅,已是汗流浹背砸琅。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留轴踱,地道東北人症脂。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像淫僻,于是被迫代替她去往敵國和親诱篷。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容