[发明专利]一种节省内存的LCS算法有效

专利信息
申请号: 201110101299.6 申请日: 2011-04-22
公开(公告)号: CN102184165A 公开(公告)日: 2011-09-14
发明(设计)人: 徐艳芬;万金利;何永刚 申请(专利权)人: 烽火通信科技股份有限公司
主分类号: G06F17/22 分类号: G06F17/22
代理公司: 北京捷诚信通专利事务所(普通合伙) 11221 代理人: 魏殿绅;庞炳良
地址: 430074 湖北省武*** 国省代码: 湖北;42
权利要求书: 查看更多 说明书: 查看更多
摘要:
搜索关键词: 一种 节省 内存 lcs 算法
【说明书】:

技术领域

发明涉及两个序列的比较算法,具体说是一种节省内存的LCS算法。所述LCS是指最大共同子序列(最长公共子序列),LongestCommon Subsequence。可广泛应用于文本比较、图形相似处理、计算生物学等领域。

背景技术

LCS(Longest Common Subsequence)算法是计算机科学领域比较经典的算法,用来比较序列的相似程度,具体说是用来寻找多个序列(一般是两个)最长公共子序列的一种算法。

LCS算法本申请不做详细介绍(可参考http://www.ics.uci.edu/~eppstein/161/960229.html)。这种算法消耗内存的多少跟序列的长度有关,如图7所示,是其算法的一部分。由图7中带下划线的文字部分可见,LCS算法会用一个二维数组C来存储两个序列在比较过程中的状态。以字符串这种典型的序列为例,两个字符串NemAtode kNOwledge,empty bottle,它们的公共序列是“emtole”,如图1所示。

LCS算法会用二维数组来记录状态,如图2所示。显然,如果第一个字符串长度为m,第二个字符串长度为n,这里二维数组需要内存为sizeof(int)*(m+1)*(n+1)。如果m和n为2万,这里需要耗费的内存将近1600MB,如果为10万,需要耗费的内存将近40GB。

在实际应用中,我们想比较两个源代码文件(这里把行看作一个序列节点),几万行的文件也比较常见,用目前的这种耗费巨大内存算法不太现实(IBM的Java IDE开发环境Eclipse默认的比较文件的大小上限为1MB)。所以,必须要想办法来减少这个二维数组的内存。

实际上,如图2所示,该数组有好多地方存的数字都是一样的,后来有人改进了这个算法,数组里面的数字只有两种:0和1,1表示数字跟前面的不同,0表示跟前面的相同。这样,数组可以声明为bool(布尔)类型的二维数组,需要的内存为sizeof(bool)*(m+1)*(n+1),只有之前的1/4。所述改进后将数组声明为bool(布尔)类型的LCS算法流程图如图3.a、3.b所示。

图3.a为整个LCS算法的流程,图3.b为图3.a所示LCS算法中“m*n嵌套循环给arrCon各个数据位赋值”这个步骤的细化。改进之后通过增加代码复杂度达到了减少内存占用的目的。图3.a、3.b所示算法的核心思想是通过一个二维布尔数组arrCon[m,n]作为临时变量存储序列比较过程中的状态,然后通过循环遍历得出两个序列的公共子序列。

随着计算量的增加,LCS算法中布尔值的存取也出现了消耗内存大的问题。为进一步减少内存的占用,此种改进算法有必要进一步优化。

还能不能进一步减少这个二维布尔数组arrCon[m,n]的内存呢?表面上看,bool类型只占一个字节,不能再减少了。实际上,我们知道计算机是用0和1来存储数据的,一个字节(Byte)有8位(bit)。用一个字节也就是8个位来存储一个0或者1似乎有些浪费。如果语言能提供位(bit)这种数据类型就好了,用这种类型定义的数组,理论上这个数组所消耗的内存只有最初int数组的1/32。

以C/C++为例,C/C++本身没有提供位(bit)这种数据类型,不过我们可以定义结构体sbyte来访问位。如图4所示。用sizeof(sbyte)检查一下,运算结果确实是1。

假设我们原来要定义一个m行n列的bool数组,现在以结构体sbyte为基础,就可以只用定义m*n/8的一维整形数组sbyte[]arMatrix(参见图5所示的C/C++位直接存储)。由于新数组arMatrix是对位进行存取,即数组上每个元素可以存储8个布尔值,所以整个数组arMatrix仍可以存储m*n个布尔值。

目前市面上有多种文本比较工具(如VDiff和Compare It!)就是利用这一特性。不过这种做法有它的局限性,即这种结构体其他语言有可能无法实现,如C#、Java等。

发明内容

针对现有技术中存在的缺陷,本发明的目的在于提供一种节省内存的LCS算法,同样可以使内存消耗只有原来的1/32,而且同时适用于绝大部分编程语言。

为达到以上目的,本发明采取的技术方案是:

一种节省内存的LCS算法,其特征在于:用一个一维整形数组存储两个序列在比较过程中的比较状态数据;

下载完整专利技术内容需要扣除积分,VIP会员可以免费下载。

该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于烽火通信科技股份有限公司,未经烽火通信科技股份有限公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服

本文链接:http://www.vipzhuanli.com/pat/books/201110101299.6/2.html,转载请声明来源钻瓜专利网。

×

专利文献下载

说明:

1、专利原文基于中国国家知识产权局专利说明书;

2、支持发明专利 、实用新型专利、外观设计专利(升级中);

3、专利数据每周两次同步更新,支持Adobe PDF格式;

4、内容包括专利技术的结构示意图流程工艺图技术构造图

5、已全新升级为极速版,下载速度显著提升!欢迎使用!

请您登陆后,进行下载,点击【登陆】 【注册】

关于我们 寻求报道 投稿须知 广告合作 版权声明 网站地图 友情链接 企业标识 联系我们

钻瓜专利网在线咨询

周一至周五 9:00-18:00

咨询在线客服咨询在线客服
tel code back_top