文字比較演算法 再議Nakatsu演算法

2022-01-28 16:30:56 字數 1616 閱讀 1580

研究文字比較演算法已經一段時間了。把思路重新理了理。

在「文字比較演算法ⅳ——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演算法在...

再議公交查詢演算法

前段時間寫過一篇 公交路線查詢演算法 其中設計了乙個資料儲存的方案,這裡又做了一番改進。公交路線查詢演算法 提到的演算法最多提供倒乘一次的方案 我覺得在實際應用中也能基本滿足需要,如果乙個城市公交倒乘一次都不能到達目的地的話,公交也太不發達了 如果將以下資料初始化為一張圖,就可以按照圖的路徑查詢演算...