随笔分类 - 文本比较算法
摘要:研究文本比较算法已经一段时间了。把思路重新理了理。 在“文本比较算法Ⅳ——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 .
阅读全文
摘要:文本比较算法Ⅰ——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,那么操作的过程的次数表示两个字符串的差...
阅读全文