CN102222093B - 一种获取字符串最长公共子串的方法 - Google Patents
一种获取字符串最长公共子串的方法 Download PDFInfo
- Publication number
- CN102222093B CN102222093B CN 201110152462 CN201110152462A CN102222093B CN 102222093 B CN102222093 B CN 102222093B CN 201110152462 CN201110152462 CN 201110152462 CN 201110152462 A CN201110152462 A CN 201110152462A CN 102222093 B CN102222093 B CN 102222093B
- Authority
- CN
- China
- Prior art keywords
- character
- current
- interval
- substring
- array
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Mobile Radio Communication Systems (AREA)
Abstract
本发明涉及一种获取字符串最长公共子串的方法,为了提高字符串之间最长公共子串的获取效率,本发明方法首先对某个匹配字节的两侧进行双向比较,得出初步公共子串,计算其长度;其次在当前的最长公共子串长度的基础上,结合多种跨越机制以试图找到更长的公共子串,循环往复,直至字符串遍历完毕。采用本发明,能够提高最长公共子串获取的计算效率,并减小资源开销。
Description
技术领域
本发明属于字符判别技术领域,具体涉及一种获取字符串最长公共子串的方法。
背景技术
随着社会的不断发展,各方面的信息量越来越大,想从其中查找或排除某些给定的信息也越来越难,通过找出字符串之间的最长公共子串(Longest Common Substring)是解决上述问题的一种方法。最长公共子串可以用于度量字符串之间的相似性,经常被应用于生物序列分析、盗版检测、信息安全等方面。目前的获取最长公共子串的方法主要包括基于动态规划(Dynamic Programming)的方法、基于广义后缀树(Generalized Suffix Tree)的方法和基于后缀数组(Suffix Array)的方法。
基于动态规划的方法非常简单,是解决最长公共子串问题的典型方法之一。需要构造一个二维表,使用单向递推的方法求出最长公共子串。但是计算效率较低,适合短串的最长公共子串分析。
基于广义后缀树的方法效率较高,其特点是把给定的源字符串的所有后缀建成一棵树,树的每个节点都是一个字符串,树根是空字符串。通过在这棵树上找到深度最大并且从属于所有源字符串的节点,那么从根到这个节点路径上的所有节点字符串拼接起来就是最长公共子串。
基于后缀数组的方法比较复杂,适合计算串长度较长的最长公共子串分析。后缀数组是后缀索引按照后缀的字典顺序排列而组成的数组。该方法的特点是将源字符串组合成一个新串,中间插入哨兵(sentinel)字符,根据合成串构造后缀数组和名次数组(后缀数组取逆),并由二者计算相邻后缀数组元素指向的后缀的最长公共前缀数组,最后根据后缀数组和最长公共前缀数组计算最长公共子串。
上述计算最长公共子串的方法判定速率较低,不能完全满足实际应用的需要,且占用空间较大,实际应用困难。
发明内容
本发明所要解决的技术问题是提供一种获取字符串最长公共子串的方法。采用本发明能够提高最长公共子串的获取效率,达到更快速的效果;并能节约空间,减少硬件资源开销。
本发明的获取字符串最长公共子串的方法,依次包括如下内容:
A、接收单元接收待处理的两个字符串,将字符串分别命名为S1 和S2,假定S2为被比较字符串;
B、预处理单元对S2进行预处理遍历,建立两个面向字符和连续同值区间的索引;
C、基于S1当前的字符,查找S2的预处理索引,发现相同的字符后,跨越S2中不匹配字符直至匹配点;
D、双向比较单元进行双向比较计算,找到基于当前匹配字符的公共子串,并计算其长度L;
E、查找S2的预处理索引,判定是否还存在下一个与S1当前的字符相匹配的字符,若存在,则跨越至S2中下一个匹配点,重复步骤D、E;若不存在,则步骤C中S1的计算点跨越至当前的字符序号加上(L+1)的位置,重复步骤C、D、E,通过第一判断单元将更长的公共子串代替已有的最长公共子串,循环存入存储单元,直至通过第二判断单元判断S1遍历完毕;获得两个字符串的最长公共子串,经输出单元输出。
本发明的方法中步骤B对S2进行预处理遍历过程为:引入位置数组和起始点数组;位置数组按照S2中字符的排列方式,每个位置存储的数据均指向当前对应字符的下一区间的最后位置,起始点数组指向当前字符串所在的字符集中每个字符第一次出现的位置;对于S2中的连续同值区间,位置数组用负数记录区间结束的位置,且在该区间倒数第二个位置记录区间开始的位置;位置数组的默认值为0,即若位置数组指向0,证明该字符计算结束;起始点数组默认值为S2的长度L2取负,即若起始点数组指向0,证明该字符串计算结束。
本发明的方法中步骤D中的双向比较计算的具体过程为:查找S1 和S2当前匹配字符之前部分的所有以当前匹配字符为串尾的子串的公共后缀,以及S1 和S2当前匹配字符之后部分的所有以当前匹配字符为串首的子串的公共前缀,分别找到二者的最长公共前缀/后缀,将其相加;
在双向比较计算时,通过预处理遍历得出的索引数组位置数组,跨过不匹配字符,直接找到S2中只与S1中当前字符相同的字符的位置,进行双向比较计算;
在对S2进行预处理遍历时,将连续同值区间作为一个元素处理;
若在S1 和S2当前匹配字符的右侧均为连续同值区间,则将连续同值区间作为一个元素处理,根据S2预处理遍历所引入的索引数组,比较同值区间中元素的数目,如果两个字符串同值区间中元素的数目不相等,则根据S2的预处理索引跨至下一个匹配点;
若S1中当前连续同值区间的宽度小于等于当前已有最长公共子串的长度,且该区间两边的字符均不属于S2字符集,则直接跨过此连续同值区间,进入S1的下一个匹配点。
本发明利用双向比较以及一系列跨越机制,减小了数据处理的工作量,不需要完全遍历字符串。前期采用预处理技术将字符串的特征进行归类,便于查询;其次采用字符跨越的技术跨过大部分不匹配的比较,采用连续同值区间跨越技术跨过连续相同值的匹配过程,采用连续小区间跨越技术跨过不大于当前最长公共子串的字符区间,提高了获取效率。
附图说明
图1 是本发明的获取字符串最长公共子串的方法中的硬件结构框图;
图2 是本发明的获取字符串最长公共子串的方法的流程图;
图3是本发明中的进行双向比较计算的流程图。
图4是本发明中的进行字符跨越的流程图。
图5是本发明中的进行连续同值区间跨越的流程图。
图6是本发明中的进行小区间跨越的流程图。
具体实施方式
为使本发明的上述目的、特征和优点能够更加简明易懂,下面结合附图和具体实施方式对本发明进行进一步的说明。
本发明可用但不局限于主机日志或网络日志的信息安全方面。例如,安全日志公共特征分析、日志记录过滤,以及信息服务的自动分类等。在硬件方面,可用于个人计算机、服务器,多处理器系统以及包含上述任何系统的计算环境等等。
本发明可以由计算机程序模块描述,一般地,程序模块包括程序、对象、组件、数据结构等。程序模块可位于本地的计算机存储介质中。
本发明所述的S1 和S2代表源字符串,实际应用场景中不局限于两个字符串,本发明中为了便于说明,在多个源字符串存在时采用两两比较的方式,对于多个源字符串相比较时,其原理是相同的。
图1是本发明的获取字符串最长公共子串的方法中的硬件结构框图,从图中可以看出:
接收单元801、用于接收待处理的两个字符串。
本发明实施例中,接收字符串采用通过移动设备导入的方式,也可以采用通过互联网获取或通过扫描仪导入等等。
本发明实施例中,采用的硬件为通用计算机,预处理单元、双相比较单元、第一判断单元、第二判断单元均采用Intel x86架构芯片;存储单元采用联想公司的存储产品;输出单元采用联想公司的显示设备。
预处理单元802、用于对S2进行预处理遍历,建立索引。
预处理的目的是使接收的字符串以相同或相近的格式规范化,便于后续步骤执行。本发明实施例中,主要是对读入的字符串进行遍历,建立数组索引。
双向比较单元803、用于对匹配字符的两侧进行双向比较计算。
第一判断单元804、用于结合预处理信息,判断当前所获得的公共子串是否大于已有的最长公共子串。
存储单元805、用于存储当前的最长公共子串及其长度。
第二判断单元806、用于结合预处理信息,判断S2是否遍历完毕。
输出单元807、用于在字符串遍历结束后输出最长公共子串。
下面对本发明的获取字符串最长公共子串的方法的工作原理及工作过程进行介绍:
接收单元801用于接收待处理的字符串,所述的字符串为两个或以上,字符串中的字符受到其自身字符集的约束,在本系统中为便于说明,采用两两比较的方式,将待处理字符串命名为S1 和S2,假定S2为被比较字符串。预处理单元802根据接收到的字符串,对S2进行预处理遍历,建立面向字符和连续同值区间的索引,为后续双向比较计算和跨越机制做准备。双向比较单元803是在顺序遍历S1 的情况下,找到匹配字符,并对匹配字符的两侧进行双向比较计算的单元。在双向比较计算的过程中,结合参照图3-6的发明内容进行计算。第一判断单元804用于结合预处理信息,判断当前所获得的公共子串是否大于已有的最长公共子串,若大于则进入单元805,若不大于则回到单元803。存储单元805用于存储当前的最长公共子串及其长度。第二判断单元806用于结合预处理信息,判断S2是否遍历完毕,若遍历完成,则进入单元807,否则回到单元803。输出单元807用于在字符串遍历结束后输出最长公共子串。
图2是本发明的获取字符串最长公共子串的方法的流程图,从图中可以看出:
步骤101、接收待处理的字符串。
将字符串分别命名为S1 和S2,假定S2为被比较字符串;
步骤102、预处理遍历,建立索引。
对S2进行预处理遍历,建立两个面向字符和连续同值区间的索引。引入位置数组和起始点数组。位置数组按照S2中字符的排列方式,每个位置存储的数据均指向当前对应字符的下一区间的最后位置,起始点数组指向字符集中每个字符第一次出现的位置。对于S2中的连续同值区间,位置数组用负数记录区间结束的位置,且在该区间倒数第二个位置记录区间开始的位置。位置数组的默认值为0,即若位置数组指向0,证明该字符计算结束。起始点数组默认值为S2的长度取负,即若起始点数组指向0,证明该字符串计算结束。
步骤103、判断字符串S1 是否遍历完毕。
若遍历完毕,则执行步骤108,若未遍历完毕,则将S1的计算点跨越至当前的字符序号加上(L+1)的位置(L为当前最长公共子串长度,初始值为-1),执行步骤104。
步骤104、对当前两个字符串进行双向比较计算。
首先,对于S1当前的字符,查找S2的预处理索引,发现相同的字符后,跨越S2中不匹配字符直至匹配点;其次,查找S1 和S2当前匹配字符之前部分的所有以当前匹配字符为串尾的子串的公共后缀,以及S1 和S2当前匹配字符之后部分的所有以当前匹配字符为串首的子串的公共前缀,分别找到二者的最长公共前缀/后缀,将其相加;
步骤105、判断当前所获得的公共子串是否大于已有的最长公共子串。
若大于,则执行步骤106。若不大于,则执行步骤107。
步骤106、存储当前最长公共子串及其长度。
步骤107、判断是否还存在下一个与S1当前的字符相匹配的字符。
查找S2的预处理索引,判定是否还存在下一个与S1当前的字符相匹配的字符,若存在,执行步骤104;若不存在,则执行步骤103。
步骤108、获取字符串的最长公共子串。
当字符串S2遍历完毕时,读取存储单元中存储的最长公共子串,并输出。
图3是本发明进行双向比较计算的流程图。
步骤201、接收待比较字符串。
将字符串分别命名为S1 和S2,假定S2为被比较字符串; 步骤202、找到S1 和S2当前匹配字符。
针对字符串S1 当前字符,根据接收的字符串S2及其预处理遍历索引,找出S2与S1当前匹配的字符。
步骤203、查找基于当前匹配字符的最长公共子串。
查找S1 和S2当前匹配字符之前部分的所有以当前匹配字符为串尾的子串的公共后缀,以及S1 和S2当前匹配字符之后部分的所有以当前匹配字符为串首的子串的公共前缀,分别找到二者的最长公共前缀/后缀,将其相加。在查找过程中使用字符跨越机制、连续同值区间跨越机制和小区间跨越机制协助计算。
图4是本发明进行字符跨越的流程图。
步骤301、获取索引。
获取当前被比较字符串S2的预处理遍历索引。
步骤302、找出下一个匹配字符的位置。
确认需匹配的字符,查找位置数组,确定该字符下一次出现的位置。
步骤303、执行跨越。
在字符串S1与字符串S2当前所处的字符匹双向比较计算之后,跨过S2中该字符下次出现前的所有字符,直接在该字符下一次出现处对齐,继续进行双向比较计算。
图5是本发明进行连续同值区间跨越的流程图。
步骤401、获取索引。
获取当前被比较字符串S2的预处理遍历索引。
步骤402、S1与S2当前连续同值区间的比较。
当S1与S2出现某个匹配字符时,则进行双向比较计算,若当前匹配字符的单侧或两侧存在与此字符相同的字符时,则认为出现连续同值区间,即连续同值区间长度至少为2。继续进行双向比较计算,直至出现不匹配的情况时,认为此阶段的双向比较计算结束。此时出现的公共子串既包含连续同值区间,也包含其它字符。
步骤403、查找索引,找出下一个匹配的连续同值区间。
查找位置数组和起始点数组,定位下一个连续同值区间的位置及其长度,若下一个连续同值区间的长度小于当前匹配的连续同值区间,则继续跨过此区间查找,直至找到一个大于或等于当前连续同值区间的区间,执行步骤404。若不再存在连续同值区间,则连续同值区间跨越结束。
步骤404、执行跨越。
字符串S1跨过非连续同值区间,直接与S2下一个匹配的连续同值区间对齐,继续进行双向比较计算。
图6是本发明进行小区间跨越的流程图。
步骤501、获取索引。
获取当前被比较字符串S2的预处理遍历索引。
步骤502、小区间宽度计算。
当S1与S2出现某个匹配字符时,则进行双向比较计算,若当前匹配字符的单侧或两侧存在与此字符相同的字符时,则认为出现连续同值区间,在计算过程中,若S1中当前连续同值区间的宽度小于等于当前已有最长公共子串的长度,且该区间两边的字符均不属于S2字符集,说明此区间不可能是更长公共子串的一部分,则执行步骤503。
步骤503、执行跨越。
字符串S1跨过此小区间,继续进行双向比较计算。
需要说明的是,对于前述的各方法实施例,为了便于理解,将其表述为一系列动作的组合,但是本领域技术人员应该知悉,本发明并不完全受到所描述动作顺序的限制,某些步骤可以同时进行。
以上对本发明所提供的一种获取字符串最长公共子串的方法,进行了详细的介绍,本发明的优点在于,能够提高实际应用条件下的最长公共子串获取的计算效率,并减小资源开销,故可用于实际的软件或系统中。综上所述,以上具体实施方式仅用于说明本发明,而不应该被理解为对本发明的限制。
Claims (4)
1.一种获取字符串最长公共子串的方法,其特征在于,依次包括如下内容:
A、接收单元接收待处理的两个字符串,将字符串分别命名为S1 和S2,假定S2为被比较字符串;
B、预处理单元对S2进行预处理遍历,采用每个位置存储的数据均指向当前对应字符的下一区间的最后位置的方法,以及记录每个字符第一次出现的位置的方法,建立两个面向字符和连续同值区间的索引;
C、通过第二判断单元判断S1是否遍历完毕,若遍历完毕则获取字符串的最长公共字串,若未遍历完毕,则基于S1当前的字符,查找S2的预处理索引,发现相同的字符后,跨越S2中不匹配字符直至匹配点;
D、双向比较单元进行双向比较计算,以当前匹配字符为基点,分别查找当前匹配字符之前部分的所有以当前匹配字符为串尾的子串的公共后缀,以及当前匹配字符之后部分的所有以当前匹配字符为串首的子串的公共前缀,在分别找到二者的最长公共前缀/后缀,将其相加,即为基于当前匹配字符的公共子串,并计算其长度L,通过第一判断单元判断L是否大于已有最长公共字串长度,若大于,则将更长的公共子串代替已有的最长公共子串,存入存储单元,若不大于,则转入步骤E;
E、查找S2的预处理索引,判定是否还存在下一个与S1当前的字符相匹配的字符,若存在,则跨越至S2中下一个匹配点,重复步骤D、E;若不存在,则通过第二判断单元判断S1是否遍历完毕,若未遍历完毕,则步骤C中S1的计算点跨越至当前的字符序号加上(L+1)的位置,重复步骤C、D、E,若遍历完毕,则获得两个字符串的最长公共子串,经输出单元输出。
2.根据权利要求1所述的方法,其特征在于,步骤B中对S2进行预处理遍历过程为:
引入位置数组和起始点数组;位置数组按照S2中字符的排列方式,每个位置存储的数据均指向当前对应字符的下一区间的最后位置,起始点数组指向当前字符串所在的字符集中每个字符第一次出现的位置;对于S2中的连续同值区间,在计算时将其作为一个元素处理,位置数组用负数记录区间结束的位置,且在该区间倒数第二个位置记录区间开始的位置;位置数组的默认值为0,即若位置数组指向0,证明该字符计算结束;起始点数组默认值为S2的长度L2取负,即若起始点数组指向0,证明该字符串计算结束。
3.根据权利要求1所述的方法,其特征在于,步骤D中的双向比较计算的具体过程为:
查找S1 和S2当前匹配字符之前部分的所有以当前匹配字符为串尾的子串的公共后缀,以及S1 和S2当前匹配字符之后部分的所有以当前匹配字符为串首的子串的公共前缀,分别找到二者的最长公共前缀/后缀,将其相加。
4.根据权利要求1所述的方法,其特征在于,步骤C和步骤E中跨越的具体过程为:
在双向比较计算时,通过预处理遍历得出的索引数组位置数组,跨过不匹配字符,直接找到S2中只与S1中当前字符相同的字符的位置,进行双向比较计算;
若在S1 和S2当前匹配字符的右侧均为连续同值区间,则将连续同值区间作为一个元素处理,根据S2预处理遍历所引入的索引数组,比较同值区间中元素的数目,如果两个字符串同值区间中元素的数目不相等,则根据S2的预处理索引跨至下一个匹配点;
若S1中当前连续同值区间的宽度小于等于当前已有最长公共子串的长度,且该区间两边的字符均不属于S2字符集,则直接跨过此连续同值区间,进入S1的下一个匹配点。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 201110152462 CN102222093B (zh) | 2011-06-09 | 2011-06-09 | 一种获取字符串最长公共子串的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 201110152462 CN102222093B (zh) | 2011-06-09 | 2011-06-09 | 一种获取字符串最长公共子串的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102222093A CN102222093A (zh) | 2011-10-19 |
CN102222093B true CN102222093B (zh) | 2013-02-27 |
Family
ID=44778645
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN 201110152462 Active CN102222093B (zh) | 2011-06-09 | 2011-06-09 | 一种获取字符串最长公共子串的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102222093B (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103136250B (zh) * | 2011-11-29 | 2016-01-06 | 阿里巴巴集团控股有限公司 | 信息更换识别方法、装置以及信息搜索方法、系统 |
CN106502207B (zh) * | 2016-09-21 | 2019-01-01 | 珠海格力智能装备有限公司 | 数据解析方法及装置 |
CN107169315B (zh) * | 2017-03-27 | 2020-08-04 | 广东顺德中山大学卡内基梅隆大学国际联合研究院 | 一种海量dna数据的传输方法及系统 |
CN112001161B (zh) * | 2020-08-25 | 2024-01-19 | 上海新炬网络信息技术股份有限公司 | 一种文本查重方法 |
CN113609341A (zh) * | 2021-08-19 | 2021-11-05 | 白杰 | 数据字典的生成方法 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1713171A (zh) * | 2004-06-15 | 2005-12-28 | 富士施乐株式会社 | 文档处理装置、文档处理方法及记录其程序的存储介质 |
CN101187924A (zh) * | 2007-11-28 | 2008-05-28 | 北京金山软件有限公司 | 一种从双语句对获取词对译文的方法及系统 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2008090781A (ja) * | 2006-10-05 | 2008-04-17 | Kiyoshi Sasaki | 検索文字列位置情報表示装置 |
-
2011
- 2011-06-09 CN CN 201110152462 patent/CN102222093B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1713171A (zh) * | 2004-06-15 | 2005-12-28 | 富士施乐株式会社 | 文档处理装置、文档处理方法及记录其程序的存储介质 |
CN101187924A (zh) * | 2007-11-28 | 2008-05-28 | 北京金山软件有限公司 | 一种从双语句对获取词对译文的方法及系统 |
Also Published As
Publication number | Publication date |
---|---|
CN102222093A (zh) | 2011-10-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Zhang et al. | An incremental CFS algorithm for clustering large data in industrial internet of things | |
Baraglia et al. | Document similarity self-join with mapreduce | |
CN109947904B (zh) | 一种基于Spark环境的偏好空间Skyline查询处理方法 | |
Naidan et al. | Permutation search methods are efficient, yet faster search is possible | |
CN102222093B (zh) | 一种获取字符串最长公共子串的方法 | |
CN109359172B (zh) | 一种基于图划分的实体对齐优化方法 | |
CN111708740A (zh) | 基于云平台的海量搜索查询日志计算分析系统 | |
Liu et al. | U-skyline: A new skyline query for uncertain databases | |
CN103544255A (zh) | 基于文本语义相关的网络舆情信息分析方法 | |
Xie et al. | Fast and accurate near-duplicate image search with affinity propagation on the ImageWeb | |
CN103617217A (zh) | 一种基于层次索引的图像检索方法及系统 | |
CN108304502B (zh) | 基于海量新闻数据的快速热点检测方法及系统 | |
WO2020228182A1 (zh) | 基于大数据的数据去重的方法、装置、设备及存储介质 | |
WO2022127245A1 (zh) | 技术转移办公室通用信息交互方法、终端及介质 | |
Orakzai et al. | k/2-hop: fast mining of convoy patterns with effective pruning | |
CN104391908A (zh) | 一种图上基于局部敏感哈希的多关键字索引方法 | |
CN102063489B (zh) | 基于隐含分类信息的模式匹配方法 | |
Zhou et al. | MSTDB: a hybrid storage-empowered scalable semantic blockchain database | |
CN107133321B (zh) | 页面的搜索特性的分析方法和分析装置 | |
Li et al. | Batch text similarity search with mapreduce | |
CN109828785B (zh) | 一种采用gpu加速的近似代码克隆检测方法 | |
Sakr et al. | Efficient relational techniques for processing graph queries | |
Chen et al. | PBSM: an efficient top-K subgraph matching algorithm | |
Ferro et al. | GraphFind: enhancing graph searching by low support data mining techniques | |
Lin et al. | Large-scale similarity join with edit-distance constraints |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |