研究文字比較演算法已經一段時間了。把思路重新理了理。
在「文字比較演算法ⅳ——nakatsu演算法
」中提到「對角線上的數字就是最長公共子串行的下標」。
在「文字比較演算法ⅶ——線性空間求最長公共子串行的nakatsu演算法
」中提到「每行最左邊不為v的數字就是最長公共子串行的下標」。
以上兩個結論,網友sumtec都提出了質疑,並提出了反例。經過本人的驗算,sumtec是正確的,我的文章有問題。
不過,不能說nakatsu演算法有問題。在「文字比較演算法ⅶ——線性空間求最長公共子串行的nakatsu演算法
」中的前半部分詳細闡述了nakatsu演算法的計算過程,這個是沒有問題的。只是本人急於將其優化成線性空間,而忽視了證明,故而得出了錯誤的結論。
為何執著於nakatsu演算法?還是有原因的。
文字比較演算法的核心是什麼?是為了求出兩個文字的最佳匹配。
何為兩個文字的最佳匹配?匹配是兩個文字的對應關係,它包含了相同的部分,包含了相異的部分(增加、刪除、修改)。對於兩個文字來說,匹配不是唯一的。那最佳匹配就是包含了最多的相同部分(最長公共子串行),同時長度又是最短的。
例如:a:ggatcga
b:gaattcagtta
最佳匹配為
a:gga_t
c_g__
ab:gaatt
cagtta
(藍色部分表示相同部分,黑色表示相異部分,下同)
又例如:
a:481234781
b:4411327431
最佳匹配為:
a:48123478_1
b:4411327431
在研究一系列的ld演算法和lcs演算法後發現,ld演算法側重於相異部分,lcs演算法側重於相同部分
故曾經有個推論「兩文字a、b的最佳匹配長度為ld(a,b)+lcs(a,b)的值」
很不幸,這個結論又是錯的。給個反例
a:11111112
b:23333333
ld(a,b)=8;lcs(a,b)=1
最佳匹配為:
a:11111112_______
b:_______23333333
最佳匹配的長度為15≠8+1
故兩個文字的相似度的計算公式應該為lcs(a,b)/match(a,b)。match(a,b)表示最佳匹配的長度。
如果只是為了計算乙個最長公共子串行。那麼在「文字比較演算法ⅵ——用線性空間計算最大公共子串行(翻譯貼)
」中的hirschberg演算法就能很好的解決這個問題。但是要注意的是,不是每個最長公共子串行都能求出最佳匹配的。因此,hirschberg演算法對於求最佳匹配無能為力。
我現在對於求最佳匹配的思路就是求出每乙個最長公共子串行,依次算出各自的匹配,從中找到最佳匹配。
我想,這個時候,nakatsu演算法派上用處了。可以知道,當最長公共子串行的長度為p時,nakatsu演算法占用的空間為p(m-p),是個二次空間,且知道當p為m/2時,占用空間最大,為m2/4。但好處是能遍歷到所有的最長公共子串行(沒有證明)。且每組解的值是指向b的下標,每組解的橫座標指向a的下標,又省去了計算匹配的時間。
有誰能給出計算最佳匹配的建設性意見嗎?
文字比較演算法 Nakatsu演算法
在 文字比較演算法 ld演算法 文字比較演算法 needleman wunsch演算法 中介紹的ld演算法和lcs演算法都是基於動態規劃的。它們的時間複雜度o mn 空間複雜度o mn 在基於計算匹配字串情況下,是不可優化的。如果只是計算ld和lcs,空間占用可以優化到o m nakatsu演算法在...
文字比較演算法 Nakatsu演算法
在 文字比較演算法 ld演算法 文字比較演算法 needleman wunsch演算法 中介紹的ld演算法和lcs演算法都是基於動態規劃的。它們的時間複雜度o mn 空間複雜度o mn 在基於計算匹配字串情況下,是不可優化的。如果只是計算ld和lcs,空間占用可以優化到o m nakatsu演算法在...
再議公交查詢演算法
前段時間寫過一篇 公交路線查詢演算法 其中設計了乙個資料儲存的方案,這裡又做了一番改進。公交路線查詢演算法 提到的演算法最多提供倒乘一次的方案 我覺得在實際應用中也能基本滿足需要,如果乙個城市公交倒乘一次都不能到達目的地的話,公交也太不發達了 如果將以下資料初始化為一張圖,就可以按照圖的路徑查詢演算...