文本比较算法Ⅷ——再议Nakatsu算法

  研究文本比较算法已经一段时间了。把思路重新理了理。

  在“文本比较算法Ⅳ——Nakatsu算法”中提到“对角线上的数字就是最长公共子序列的下标”。

  在“文本比较算法Ⅶ——线性空间求最长公共子序列的Nakatsu算法”中提到“每行最左边不为V的数字就是最长公共子序列的下标”。

  以上两个结论,网友Sumtec都提出了质疑,并提出了反例。经过本人的验算,Sumtec是正确的,我的文章有问题。

  不过,不能说Nakatsu算法有问题。在“文本比较算法Ⅶ——线性空间求最长公共子序列的Nakatsu算法”中的前半部分详细阐述了Nakatsu算法的计算过程,这个是没有问题的。只是本人急于将其优化成线性空间,而忽视了证明,故而得出了错误的结论。

 

  为何执着于Nakatsu算法?还是有原因的。

 

  文本比较算法的核心是什么?是为了求出两个文本的最佳匹配

  何为两个文本的最佳匹配?匹配是两个文本的对应关系,它包含了相同的部分,包含了相异的部分(增加、删除、修改)。对于两个文本来说,匹配不是唯一的。那最佳匹配就是包含了最多的相同部分(最长公共子序列),同时长度又是最短的。

  例如:

  A:GGATCGA

  B:GAATTCAGTTA

  最佳匹配为

    A:GGA_TC_G__A

    B:GAATTCAGTTA

    (蓝色部分表示相同部分,黑色表示相异部分,下同)

 

  又例如:

  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的下标,又省去了计算匹配的时间。

  

  有谁能给出计算最佳匹配的建设性意见吗?

 

时间: 2024-10-24 12:16:50

文本比较算法Ⅷ——再议Nakatsu算法的相关文章

文本比较算法Ⅳ——Nakatsu算法

在"文本比较算法Ⅰ--LD算法"."文本比较算法Ⅱ--Needleman/Wunsch算法"中介绍的LD算法和LCS算法都是基于动态规划的.它们的时间复杂度O(MN).空间复杂度O(MN)(在基于计算匹配字符串情况下,是不可优化的.如果只是计算LD和LCS,空间占用可以优化到O(M)). Nakatsu算法在计算匹配字符串的情况下,有着良好的时间复杂度O(N(M-P))和空间复杂度O(N2),而且在采取适当的优化手段时,可以将空间复杂度优化到O(N),这是一个很诱人

文本比较算法Ⅶ——线性空间求最长公共子序列的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--

再议“生成全排列算法”

看了"白话算法(7) 生成全排列的几种思路(一)"和"白话算法(7) 生成全排列的几种思路(二) 康托展开".在此,将以前本人推导的全排列算法介绍一下,和广大的网友交流一下. 以例子说明,用0.1.2.3,四个数组成全排列. 首先可以知道,这四个数组成的全排列一共有4!=24个.那么给这24个全排列编号,分别为0.1.2--23.再给定一个算法,通过编号计算出一个全排列.本文的目的就是找到这样的算法. 把所有的全排列列举出来可以发现,0在末位的有6个,1在末位的有6

苹果整肃刷榜 AppStore应用排行算法再调整

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断淘宝客 站长团购 云主机 技术大厅 苹果整肃刷榜 AppStore应用排行算法再调整 (搜狐数码配图) [搜狐IT消息](国仁)2013年6月115.html">26日,苹果近日再次对AppStore应用排行算法进行了调整.据悉,这次调整后,AppStore排行榜每3小时会刷新一次. 距离年初一次算法调整过去了半个月,苹果一般通过算法调整来整肃应用刷榜行

《算法帝国》:被算法和算法交易改变的未来

当我们用崭新的视角去观察与思考,世界就会变成另外的模样.这是我们筹备举办"改变未来的算法与算法交易"研讨会的初衷. 美国雄霸全球依赖华尔街与硅谷等强大支柱,而近年来,算法对华尔街的渗透与控制体现出颠覆未来产业生态的力量.图灵公司出版的<算法帝国>一书中介绍,2000年,华尔街通过计算机程序交易的比率不足美国股市交易量的10%:2008年上半年,自动化电子交易占了全美股市交易量的60%:现在,华尔街70%以上的交易依靠所谓的黑盒子或者算法交易(闪电交易)运行.银行家和股票经纪

高效算法的常用技术(算法导论)

对于高效算法, 有些比较简单的技术, 如分治法, 随机化, 和递归求解技术. 这边介绍些更为复杂的技术, 动态规划, 贪心算法 当对于复杂问题设计算法时, 首先会想到使用分治法 来解决, 分而治之, 一个很有哲理性的思路, 再复杂的问题都可以不断分解到你可以轻松解决的粒度, 把所有简单问题都解决完后, 组合在一起就得到了复杂问题的解, 可以看出其中典型的递归求解的思路. 使用分治法的要求, 各个子问题是独立 的 (即不包含公共的子子问题,子问题不重叠 ). 如果子问题重叠, 用分治法就比较低效,

《算法基础:打开算法之门》一导读

前言 Algorithms Unlocked 计算机是如何解决问题的呢?小小的GPS是如何只在几秒钟内就从无数条可能路径中找出到达目的地的最快捷路径的呢?在网上购物时,又如何防止他人窃取你的信用卡账号呢?解决这些问题,以及大量其他问题的答案均是算法.我写本书的目的就是为你打开算法之门,解开算法之谜. 我是<算法导论>的合著者之一.<算法导论>是一本特别好的书(当然,这是我个人的主观评价),但是它确实相当专业. 本书并不是<算法导论>,甚至不能被称为一本教材.它既没有对计

java数据结构与算法之奇偶排序算法完整示例_java

本文实例讲述了java数据结构与算法之奇偶排序算法.分享给大家供大家参考,具体如下: 算法思想: 基本思路是奇数列排一趟序,偶数列排一趟序,再奇数排,再偶数排,直到全部有序 举例吧, 待排数组[6 2 4 1 5 9] 第一次比较奇数列,奇数列与它的邻居偶数列比较,如6和2比,4和1比,5和9比 [6 2 4 1 5 9] 交换后变成 [2 6 1 4 5 9]  第二次比较偶数列,即6和1比,5和5比 [2 6 1 4 5 9] 交换后变成 [2 1 6 4 5 9]  第三趟又是奇数列,选择

《算法基础:打开算法之门》一1.2 资源利用

1.2 资源利用 什么样的算法才能称为高效使用计算资源的算法呢?我们在讨论近似算法时提及了一个衡量效率的标准:时间.一个能给出正确输出但是会花费很长时间才能得出结果的算法可能是没有价值的.如果你的GPS需要一个小时才能计算出推荐的驾驶路线,你还会愿意打开GPS吗?诚然,一旦我们知道某算法能给出一个正确输出,时间便是我们用来衡量算法效率的主要方式.但是时间不是唯一的衡量标准.由于一个计算机算法必须能够在可用的内存空间上运行,因此我们可能还需要考虑该算法需要占用多大的计算机内存空间(它的"内存占用量