随笔分类 -  算法

摘要:研究文本比较算法已经一段时间了。把思路重新理了理。 在“文本比较算法Ⅳ——Nakatsu算法”中提到“对角线上的数字就是最长公共子序列的下标”。 在“文本比较算法Ⅶ——线性空间求最长公共子序列的Nakatsu算法”中提到“每行最左边不为V的数字就是最长公共子序列的下标”。 以上两个结论,网友Sumtec都提出了质疑,并提出了反例。经过本人的验算,Sumtec是正确的,我的文章有问题。 不过,不能说Nakatsu算法有问题。在“文本比较算法Ⅶ——线性空间求最长公共子序列的Nakatsu算法”中的前半部分详细阐述了Nakatsu算法的计算过程,这个是没有问题的。只是本人急于将其优化成线性空间,而. 阅读全文
posted @ 2011-03-15 15:15 万仓一黍 阅读(6575) 评论(11) 推荐(2) 编辑
摘要:在参阅《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个字. 阅读全文
posted @ 2011-03-11 09:31 万仓一黍 阅读(6243) 评论(15) 推荐(3) 编辑
摘要:判断一个整数x是否是2的N次方。 方法之一是判断x & (x - 1)==0。若为True,则x是2的N次方;若为False,则x不是2的N次方。 有人质疑,他证明了“2的n次方一定符合这个条件”, 却并没有证明“符合这个条件的一定是2的n次方”呀!更没有证明“不符合条件的一定不是2的n次方”呀。 现在,从两个方面来证明这个方法的正确性 证明之前,先给出一些定义 &运算的定义:A & B 表示将A和B转化为二进制,然后按照对位&运算。 例如:17 & 9 100012 =1710 & 1012 =910 --------------------- 阅读全文
posted @ 2011-03-04 10:25 万仓一黍 阅读(6050) 评论(4) 推荐(4) 编辑
摘要:研究文本比较算法有一段时间了。近日研读了《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 万仓一黍 阅读(16336) 评论(10) 推荐(6) 编辑
摘要:文本比较算法Ⅰ——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 . 阅读全文
posted @ 2011-02-22 12:23 万仓一黍 阅读(4588) 评论(9) 推荐(4) 编辑
摘要:在日常的需求设计中,遍历组合是一个常见的问题。  例如:现在有N个不同的数。要求在其中找到M个数,使得M个数之和为指定的S,求所有满足条件的组合。  这是一个很明显的遍历组合的问题。一般采用递推算法,求出满足条件的解。  这类问题一般都采用一个数组P,来存放解。遍历整个组合空间,来找出解(有可能是所有解、也可能是一个解,根据题目要求来定)  由于这类问题解法是固定的,故在此把该算法模块化。留待日后... 阅读全文
posted @ 2010-06-10 22:41 万仓一黍 阅读(4097) 评论(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. 阅读全文
posted @ 2010-06-07 15:49 万仓一黍 阅读(7733) 评论(8) 推荐(6) 编辑
摘要:在“文本比较算法Ⅰ——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. 阅读全文
posted @ 2010-06-03 09:38 万仓一黍 阅读(30055) 评论(14) 推荐(9) 编辑
摘要:在日常应用中,文本比较是一个比较常见的问题。文本比较算法也是一个老生常谈的话题。 文本比较的核心就是比较两个给定的文本(可以是字节流等)之间的差异。目前,主流的比较文本之间的差异主要有两大类。一类是基于编辑距离(Edit Distance)的,例如LD算法。一类是基于最长公共子串的(Longest Common Subsequence),例如Needleman/Wunsch算法等。 LD算法(Levenshtein Distance)又成为编辑距离算法(Edit Distance)。他是以字符串A通过插入字符、删除字符、替换字符变成另一个字符串B,那么操作的过程的次数表示两个字符串的差... 阅读全文
posted @ 2010-06-01 14:04 万仓一黍 阅读(28714) 评论(19) 推荐(11) 编辑
摘要:“一道算法题,看看大家的思路”,看了众多的回复,本人愚钝,没有看明白其中的奥妙。在细细研究《编程之美》中的文章后,终于理解了这个算法的思路。现将这个算法的演算过程以及代码实现(VB2005)赋予其后,和各位交流。 现再将题目复述一遍: 题目描述:有31,-41,59,26,-53,58,97,-93,-23,84十个数。SUM(N,M)表示从第N个数到到第M个数的和。例如:SUM(2,3)=-41+59=18。问:最大的和是多少?对应的N和M是多少? 先不管N和M的计算,直接计算SUM,看看用什么算法。 算法一:直接遍历穷举,求出SUM。代码如下: Public Function... 阅读全文
posted @ 2010-02-21 12:06 万仓一黍 阅读(3483) 评论(17) 推荐(0) 编辑
摘要:题目描述:有31,-41,59,26,-53,58,97,-93,-23,84十个数。SUM(N,M)表示从第N个数到到第M个数的和。例如:SUM(2,3)=-41+59=18。问:最大的和是多少?对应的N和M是多少?  这个题目并不难,实现的方法多种多样。最坏的算法,遍历所有的情况,求出最大和。  我在这儿提一个算法的思路,不是最优的,主要是讲解这个算法的。  模拟生物算法(谢谢装配脑袋指正,这... 阅读全文
posted @ 2010-01-27 14:05 万仓一黍 阅读(3495) 评论(20) 推荐(2) 编辑
摘要:日前在网上看到一道面试题。颇有意思,也细细的研究一番。现将该题发布于此,和各位交流一下。   某幢大楼有100层。你手里有两颗一模一样的玻璃珠。当你拿着玻璃珠在某一层往下扔的时候,一定会有两个结果,玻璃珠碎了或者没碎。这幢大楼有个临界楼层。低于它的楼层,往下扔玻璃珠,玻璃珠不会碎,等于或高于它的楼层,扔下玻璃珠,玻璃珠一定会碎。玻璃珠碎了就不能再扔。现在让你设计一种方式,使得在该方式下,最坏的情况... 阅读全文
posted @ 2009-12-20 20:35 万仓一黍 阅读(7809) 评论(44) 推荐(4) 编辑
摘要:本人阅读了《编程之美》,参阅了其中的——计算字符串的相似度——一节。感觉颇为实用。现将这一文章贴于此处,并将代码赋予其后。  许多程序会大量使用字符串。对于不同的字符串,我们希望能够有办法判断其相似程度。我们定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法为:    1.修改一个字符(如把“a”替换为&ldqu... 阅读全文
posted @ 2009-12-17 19:43 万仓一黍 阅读(9555) 评论(14) 推荐(3) 编辑
摘要:前两日,写了一篇“遍历组合的实现——VB2005”。在数学分支里,排列与组合是不分家的。于是,动手写下本文。在上一文中,采用了递归调用,虽然便于理解,但是算法的效率上打个折扣。本文一并重写,改为循环调用。 代码赋予其后,用的是VB2005 两个类,一个是clsPermutation,用来计算排列的;一个是clsCombination,用来计算组合的。下面,把各个函数说明一下。 类clsPermutation: 函数:GetPermutation 获得指定标号的排列,返回值是一个数组 参数: Lower,排列中的下限 Upper,排列中的上限 Count,排列... 阅读全文
posted @ 2009-12-12 12:45 万仓一黍 阅读(2100) 评论(3) 推荐(2) 编辑
摘要:在VB2005中,读取文本文件中的文本可以采用的方法是System.IO.File.ReadAllText,这个函数有两个参数,一个是文件的文件名(包含路径);一个是文本的编码,如果省略,采用系统默认的编码。可是,一般的文本编码有ANSI、Unicode、UTF8等。如果编码的格式选择不对,则读出来是一段乱码。 笔者依照网上的资料,编写一个函数,能自动根据判别文本的编码格式,首先是将文本文件的数据读到字节数组中,再判别文本的编码格式,最后将字节数组转化为文本。 依据字节流,前三个字节标识着这个文本的编码方式。那么依据这三个字节的值,用不同的编码来解析这个字节流。这是下面这段代码的核心内... 阅读全文
posted @ 2009-12-11 08:29 万仓一黍 阅读(2723) 评论(4) 推荐(1) 编辑
摘要:在数学的统计分支里,排列与组合是一个很重要的分支。在各种实际应用中,排列与组合也扮演了重要的角色。举例来说,安排人员参加活动可以看作是组合的应用。比方说,现在有十个人,选出其中的五个人参加某项集体活动。由于彼此之间有着脾气性格等因素,所以,不同的人员组合有着不同的工作效率。现在,要求你找出效率最高的人员安排。因为选出五人参加活动,没有顺序问题,因此是一个组合的问题。如果说,随机的选出一个组合,用计算机来实现是非常简单的,常见的"洗牌算法"就能实现。要找出效率最高的组合,只要遍历所有的组合即可。问题是如何遍历所有的组合。 还是利用数学知识,我们知道组合函数C(m,n)代表着从 阅读全文
posted @ 2009-10-14 13:31 万仓一黍 阅读(2066) 评论(0) 推荐(0) 编辑