自然語言處理1-2: 編輯距離
原文出處:https://algorithms.tutorialhorizon.com/dynamic-programming-edit-distance-problem/
問題:假設我們現在有兩個字串s1和s2,並且給出如下所示的三個編輯操作,寫出一個演算法,當每次只能使用其中一個編輯操作時,找到將字串s1轉換成s2的最小編輯次數。
允許的編輯操作:
1.insert-插入一個字元
2.delete-刪除一個字元
3.replace-將字串中的一個字元用另一個字元代替
例如:
String s1 = "horizon" String s2 = "horzon" Output:1 {remove 'i' from string s1} String s1 = "horizon" String s2 = "horizontal" Output: 3 {insert 't', 'a', 'l' characters in string s1}
分析:從後往前依次比較字串中的每一個字元,對於每次比較之後的結果,我們執行如下兩種操作將問題變成子問題:
1.如果兩個字串末尾的字元相等,那麼我們忽視最後一個字元,將問題轉化為找到剩下的字元組成的字串的編輯距離
2.如果兩個字串末尾的字元不相等,那麼我們分別執行以上三種操作(insert,delete,replace),執行完之後,再遞迴的
解決兩個字串的編輯距離。
演算法:假設我們有長度為n的字串s1和長度為m的字串s2,比較s1和s2末尾的字元:
1.如果兩個字元相等,那麼忽視末尾字元,求前n-1和m-1的字串的編輯距離
2.如果兩個字元不相等,那麼執行如下三種操作,並且選擇其中的最優解:
a.在s1的末尾插入一個字元,該字元和s2末尾的字元相同,此時s1的長度是n+1,s2的長度是m。然後忽視末尾字元,求前n和前m-1的字串的編輯距離x1
b.將s1的末尾的字元刪掉,此時s1的長度是n-1,s2的長度是m。求長度為n-1和m的字串的編輯距離x2
c.將s1的末尾的字元用s2的末尾的字元代替,然後求前n-1和m-1的編輯距離x3
編輯距離就是x1+1, x2+1, x3+1中的最小值
同時,我們可以用動態規劃自底向上來降低時間複雜度