文本比較算法
摘要: 研究文本比較算法已經一段時間了。把思路重新理了理。 在“文本比較算法Ⅳ——Nakatsu算法”中提到“對角線上的數字就是最長公共子序列的下標”。 在“文本比較算法Ⅶ——線性空間求最長公共子序列的Nakatsu算法”中提到“每行最左邊不為V的數字就是最長公共子序列的下標”。 以上兩個結論,網友Sumtec都提出了質疑,並提出了反例。經過本人的驗算,Sumtec是正確的,我的文章有問題。 不過,不能說Nakatsu算法有問題。在“文本比較算法Ⅶ——線性空間求最長公共子序列的Nakatsu算法”中的前半部分詳細闡述了Nakatsu算法的計算過程,這個是沒有問題的。只是本人急於將其優化成線性空間,而.閱讀全文
摘要: 在參閱《A Longest Common Subsequence Algorithm Suitable for Similar Text Strings》(Narao Nakatsu,Yahiko Kambayashi,Shuzo Yajima著)后。發現該算法可以利用線性空間求出最長公共子序列。該算法的時間占用O(n(m-p+1)),p為最長公共子序列的長度。 字符串A和字符串B,計算LCS(A,B) 定義一:設M=Len(A),N=Len(B),不妨設M≤N。 定義二:A=a1a2……aM,表示A是由a1a2……aM這M個字符組成 B=b1b2……bN,表示B是由b1b2……bN這N個字.閱讀全文
摘要: 研究文本比較算法有一段時間了。近日研讀了《A Linear Space Algorithm for Computing Maximal Common Subsequences》(D.S.Hirschberg著)。文章寫於1975年。很多其他的論文都會引用這篇論文,可見這篇論文的質量。同時,該文作者D.S.Hirschberg也寫了很多有關LCS的文章,也都是經典中的經典。 在研讀這篇文章之后,我將它翻譯成中文。由於本人的英語與文法都還不行,故翻譯的質量也就一般了,也歡迎廣大網友指正。Introduction導論 The problem of finding a longest common .閱讀全文posted @ 2011-02-27 18:51 萬倉一黍 閱讀(12054) | 評論 (7) 編輯
摘要: 文本比較算法Ⅰ——LD算法 文本比較算法Ⅱ——Needleman/Wunsch算法 文本比較算法Ⅲ——計算文本的相似度 文本比較算法Ⅳ——Nakatsu算法 在寫了本系列的前面幾篇文章之后。有些網友質疑文章的正確性。在仔細的推敲之下,這些網友指正的不無道理。下面舉一個反例,來質疑前面文章的正確性。 文本:A:481234781;B:4411327431 先按照LD算法,計算LD矩陣 LD矩陣 4 4 1 1 3 2 7 4 3 1 0 1 2 3 4 5 6 7 8 9 10 4 1 0 1 2 3 4 5 6 7 8 9 8 2 1 1 2 3 4 5 6 7 8 9 1 3 2 2 1 .閱讀全文
摘要: 在“文本比較算法Ⅰ——LD算法”、“文本比較算法Ⅱ——Needleman/Wunsch算法”中介紹的LD算法和LCS算法都是基於動態規划的。它們的時間復雜度O(MN)、空間復雜度O(MN)(在基於計算匹配字符串情況下,是不可優化的。如果只是計算LD和LCS,空間占用可以優化到O(M))。 Nakatsu算法在計算匹配字符串的情況下,有着良好的時間復雜度O(N(M-P))和空間復雜度O(N2),而且在采取適當的優化手段時,可以將空間復雜度優化到O(N),這是一個很誘人的結果。下面將全面介紹Nakatsu算法。 字符串A和字符串B,計算LCS(A,B) 定義一:設M=Len(A),N=Len(B.閱讀全文
摘要: 在“文本比較算法Ⅰ——LD算法”中,介紹了編輯距離的計算。 在“文本比較算法Ⅱ——Needleman/Wunsch算法”中,介紹了最長公共子串的計算。 在給定的字符串A和字符串B,LD(A,B)表示編輯距離,LCS(A,B)表示最長公共子串的長度。 如何來度量它們之間的相似度呢? 不妨設S(A,B)來表示字符串A和字符串B的相似度。那么,比較合理的相似度應該滿足下列性質。 性質一:0≤S(A,B)≤100%,0表示完全不相似,100%表示完全相等 性質二:S(A,B)=S(B,A) 目前,網上介紹的各種相似度的計算,都有各自的不盡合理的地方。 計算公式一:S(A,B)=1/(LD(A,B)+.閱讀全文
摘要: 在“文本比較算法Ⅰ——LD算法”中介紹了基於編輯距離的文本比較算法——LD算法。 本文介紹基於最長公共子串的文本比較算法——Needleman/Wunsch算法。 還是以實例說明:字符串A=kitten,字符串B=sitting 那他們的最長公共子串為ittn(注:最長公共子串不需要連續出現,但一定是出現的順序一致),最長公共子串長度為4。 定義: LCS(A,B)表示字符串A和字符串B的最長公共子串的長度。很顯然,LSC(A,B)=0表示兩個字符串沒有公共部分。 Rev(A)表示反轉字符串A Len(A)表示字符串A的長度 A+B表示連接字符串A和字符串B 性質: LCS(A,A)=Len.閱讀全文
摘要: 在日常應用中,文本比較是一個比較常見的問題。文本比較算法也是一個老生常談的話題。 文本比較的核心就是比較兩個給定的文本(可以是字節流等)之間的差異。目前,主流的比較文本之間的差異主要有兩大類。一類是基於編輯距離(Edit Distance)的,例如LD算法。一類是基於最長公共子串的(Longest Common Subsequence),例如Needleman/Wunsch算法等。 LD算法(Levenshtein Distance)又成為編輯距離算法(Edit Distance)。他是以字符串A通過插入字符、刪除字符、替換字符變成另一個字符串B,那么操作的過程的次數表示兩個字符串的差異。 .閱讀全文