CN1392497A - 大字符串匹配方法 - Google Patents
大字符串匹配方法 Download PDFInfo
- Publication number
- CN1392497A CN1392497A CN 02134428 CN02134428A CN1392497A CN 1392497 A CN1392497 A CN 1392497A CN 02134428 CN02134428 CN 02134428 CN 02134428 A CN02134428 A CN 02134428A CN 1392497 A CN1392497 A CN 1392497A
- Authority
- CN
- China
- Prior art keywords
- string
- matching
- coupling
- section
- character
- 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.)
- Pending
Links
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种大字符串匹配方法。所述的大字符串匹配方法是对字符串先按某种特征字符或字符序列进行分段,每段字符串变换为一个数值元素,如(长度,段的字符累加和),生成长度小得多的两个串,对这两个串进行匹配后,然后分别匹配各个子段,运算量近似于O(M+N),从而大大降低了运算的复杂度,提高了运算速度。本发明同时还公开了一种对角线优先匹配方法,用于匹配字符串,大大提高了匹配速率。
Description
技术领域
本发明涉及一种大字符串匹配方法,属于计算机编程的技术领域。
背景技术
字符串匹配是电脑应用中常用的算法。例如,设两个串,S1=“abcde”,S2=“afbceg”,则abce是S1和S2的公共匹配串,即S1和S2的相同部分,若用*标识不匹配的部分,则这两个串可表示为S1=“abc*e”,S2=“a*bce*”。
两个字符串中的字符如果相等,则称这两个字符匹配。例如上例中,S1[0]=S2[0]=’a’,S1[4]=S2[5]=’e’,则称S1[0]与S2[0]匹配,S1[4]与S2[5]匹配。同样,设两个序列P,Q,P={p1,...,pn},Q={q1,...,qm},(P,Q的元素pi,qi可以是整数、或者任何其它类型的一维或多维数据,)则P,Q匹配可称为数据序列匹配;如果pi=qj,则称序列P的元素pi与序列Q的元素qj匹配。为了方便和统一起见,元素为非字符的序列也称为串,两个序列的匹配运算称为串的匹配运算。
设待匹配的两个串长度分别为M、N,传统的字符串匹配算法是生成匹配矩阵(生成匹配矩阵的运算量是M*N次比较和至少M*N次读/写操作,即使形式上不生成完整的匹配矩阵,但概念上也必须生成该矩阵,并且需要同样或者略多于生成矩阵的计算量),然后在矩阵中搜索最大匹配串(这个运算量也是O(M*N)),其总运算量是O(M*N)。对于大型的字符串,如果按照上述传统的匹配方式,其运算量将是非常惊人的。
发明内容
本发明提供一种运算复杂度低,运算速度快的大字符串匹配方法。
本发明所述的大字符串匹配方法,按以下步骤进行:
a)在需要匹配的两个大的字符串M、N中选择一个特征字
符或字符串序列,根据特征字符或字符串序列对所要匹
配的两个字符串分别分段,得到{Mi},{Nj},用散列变换
方法计算每段小字符串Mi和Nj的散列值,以散列值为元
素组成变换序列(ai,bi)和(cj,dj),这样把需要匹配的两个大
的字符串分别变换成序列{(ai,bi)}以及{(cj,dj)};
b)然后对序列{(ai,bi)}、{(cj,dj)}进行匹配。如果ai=cj并且bi
=dj则表示M中元素(ai,bi)与N中元素(cj,dj)匹配,标记出
匹配项;
c)序列{(ai,bi)}、{(cj,dj)}中匹配和不匹配所对应的段分别处
理,其中匹配项对应的小字符串段进行字符串匹配,并
进一步标记出小字符串段中的匹配和非匹配内容并输出
匹配和非匹配内容;做为粗匹配,非匹配项对应的小字
符串段全部作为非匹配内容输出;做为细匹配,可以对
各个非匹配段进行进一步匹配,找出更多的匹配内容。
上述a)步骤中的散列变换采用计算每段小字符串的长度和以及段中各字符累加和的散列计算方式,变换为一对关于段的长度及段中各字符累加和的序列Mi(ai,bi)以及Nj(cj,dj)。上述b)步骤的匹配运算和c)步骤中对各个段做进一步匹配的算法使用对角线匹配算法。对角线匹配算法描述于后。
本发明所述的算法是对字符串先按某种特征字符或字符序列进行分段,每段字符串变换为一个数值元素,如(长度,段的字符累加和),生成长度小得多的两个串,对这两个串进行匹配后,然后分别匹配各个子段,运算量近似于O(M+N),从而大大降低了运算的复杂度,提高了运算速度。
附图说明
图1为将两个大型的串转换为两个小得多的数组的流程图。
图2为对角线搜索匹配算法用于两个数组的匹配过程的流程图;
图3为对角线搜索匹配算法用于两个字符串的匹配过程示意图。
具体实施方式
本发明所述的大字符串匹配方法,按以下步骤进行:
a)如图1所示,在需要匹配的两个大的字符串M、N中选择一个特征字符或字符串序列,根据特征字符或字符串序列对大字符串分别分段,得到每段小字符串变换为一对关于段的长度及段中各字符累加和的数据构成序列M{(ai,bi)}以及N{(cj,dj)},把需要匹配的两个大的字符串分别变换成数组Mi(ai,bi)以及Nj(cj,dj);其中ai,bi分别代表字符串M的第i段字符串Mi的长度和累加和,而cj,dj分别代表字符串N的第j段Nj的长度和累加和;
b)然后对数组Mi(ai,bi)与数组Nj(cj,dj)以ai=cj及bi=dj为条件进行匹配,找出匹配项;
c)数组中匹配和不匹配所对应的段分别处理,其中匹配项对应的小字符串段进行字符串匹配,并进一步标记出小字符串段中的匹配和非匹配内容并输出匹配和非匹配内容,而非匹配项对应的小字符串段则作为非匹配内容输出。
上述的数组以及每个小段的字符串的匹配方法除了可采用传统的矩阵匹配方法外,也可以采用对角线优先匹配方法进行匹配。对角线优先匹配算法用于上述的数组Mi(ai,bi)以及Nj(cj,dj)的匹配时,其特征是把两个数组Mi(ai,bi)以及Nj(cj,dj)看作是两个串,然后对这两个串进行匹配,分析此算法可以运用字符串匹配技术中常用的匹配矩阵分析法进行分析,实际运算过程并不需要生成匹配矩阵。
如图2所示,设两个串A,B的长度分别为m,n,其匹配矩阵则为m*n的二值矩阵M,其中矩阵元素(i,j)表示A(i)与B(j)是否相等(不妨以1表示相等,0表示不相等)。算法是:
a)以矩阵左上角元素,即M(0,0)为起点。
b)从起点开始,搜索从该点向右下方向的一个1*1矩阵(1*1矩
形就是该点本身),检查该点是否匹配。如果是,将该点的右下
点作为新的起点,重复步骤(b)
c)否则,将该矩形向右下扩大一行和一列,即以矩形右下角的点的
右下点作为新的矩形右下角,在矩形内部(实际上是扩大的那一
行和那一列)搜索匹配点,如果找到,则以该点的右下点为新的
起点,转回步骤(b)继续搜索;
d)如果没有找到,重复步骤(c),直到搜索达到矩阵的边界为止,
搜索结束。
e)标记步骤(a)-(d)中搜索到的匹配点,就是两个数组(或字符串)
的匹配部分。
对于字符串采用对角线优先匹配方法进行匹配与上述的数组匹配相同,例如对于两个字符串段S1=“abcedefghi”,和字符串S2=“abedfgijhc”用对角线优先匹配方法进行匹配,如图3所示,先以S1的字符横向顺序排列,而S2的字符串则纵向顺序排列,形成一个10*10的矩阵,首先从第一点(1,1)开始,即首先对比S1的第一个字符“a”与S2的第一个字符“a”,两者相同;然后S1、S2分别选取下一个字符,相当于矩阵向右下角移动一格,至点(2,2),即对比S1的第二个字符“b”与S2的第二个字符“b”,其是相同的,然后S1、S2分别再选取下一个字符,相当于矩阵再向右下角移动一格至点(3,3),为新的矩阵起点搜索,即对比S1的第三个字符“c”与S2的第三个字符“e”,其不相等,则把该新矩阵向右下方移动一格,到达点(4,4),然后在以点为(3,3)和点(4,4)为对角的矩形中继续搜索匹配字符(实际就是搜索这个矩形的底行和右列),首先比较点(4,4),不匹配则搜索底边从(4,3)到(4,3)找到点(4,3)是匹配的,即S1的第四个字符“e”与S2的第三个字符“e”是相同的,然后从该点(4,3)向右下方移动一格到达点(5,4),以点(5,4)为新的矩形起点继续重复上述的匹配,直到矩阵的边界为止。以上述方法搜索的匹配结果如下:“ab*ed*fg*i”。在图3中,标记的黑点即是匹配点,而箭头表示搜索移动的方向。
为了进一步说明本发明对传统串匹配算法的改进,我们假定有两个长度约30K的字符串,各有1000行的文本,平均每行约30个字符,不妨也假设每行都是30个字符,并且选择回车/换行符作为串的分界符,首先对两个文本各行计算字符数和字符累加和,这样各有30000次运算,这样得到的两个长度为1000的数组Mi(ai,bi)以及Nj(cj,dj)。按照上述的对角线匹配算法匹配这两个数组的运算量最坏情形是2*1000*1000次比较,最好情形是1500次运算。然后分别对各行进行匹配,对这样1000个长度为30的串匹配运算量最坏情形小于2900000次比较和60000次加法。如果用传统算法,其仅仅生成匹配矩阵的运算量将是30000*30000次比较,两者运算量相差300倍以上。
应用本发明所带来的改进与两个串的大小有关,也与所选择的分界字符(序列)有关。串的规模越大,性能的改进越大;可以推导出,按匹配运算最坏情况下的运算量估计,分界符把长度为M的串分为数量为M2/3的等长的段时,所选的分界符为最优的。当然实际情况要比这复杂得多。对于两个相近的串,选择好合适的分界符,应用本发明的运算量通常是很接近线性的,比如在不同时间浏览同一证券行情的两个网页的匹配,两个物种相近的DNA链的匹配。
在匹配矩阵上搜索最大匹配串时,矩阵上各元素的“价值”是不相同的,靠近主对角线处的元素,其价值最大;越靠近右上角和左下角的元素,其价值越小。根据这个特点,本算法中的对角线搜索匹配算法以对角线为优先搜索路径,抛弃了离主搜索路径太远的元素,实际实现时,并不需要生成匹配矩阵,也不需要在整个矩阵中计算最大匹配串,只以当前搜索点为起点,向右下方向一个小矩形区域上搜索匹配的元素,找到匹配的元素后即以该元素为新起点,这样无回溯地重复进行直到两个串的末尾为止。因此该搜索算法的一般运算量近似为线性的。本算法的主要改进是不需要计算搜索路径外的元素是否匹配,不需要在整个矩阵中搜索所有的匹配子串和计算最大匹配串,同时也不保证搜索得到的匹配串是最大匹配串(在绝大多数情况下可得到最大匹配串或近似最大匹配串)。
匹配各个段的子串,同样可使用对角线搜索匹配法,也可使用经典的字符串匹配法,如果某个段很大,也可另选择其它的分界字符(序列),递归使用本算法。
本方法是一种通用字符串匹配算法,可以用于任何超大字符串匹配的场合,以标识出两个大字符串的相同部分和不相同部分的内容,例如匹配两个网页中哪些内容相同,哪些内容不相同,匹配两本书中文字内容相同和不相同部分等。使用经典的字符串匹配方法匹配两部书的内容,运算量是惊人的,用本方法则可以告速地匹配,特别是可以高速实时地匹配网页内容。其他的可能应用举例如下:
应用举例1。此算法的另外一个应用是计算两个不同物种DNA链的相似度,并标识出两者DNA的相同部分和不同部分。如果采用传统的匹配算法,运算量是非常惊人的。
应用举例2。出版社和作者可以对一本书的两个不同版本进行比较,标识出书中的哪些地方进行了增、删、改、方便作者对书的修订,也方便出版社检查对新版书的排版是否引入了错误。
应用举例3。程序员修改了某个程序后,想知道他修改了哪些地方。源程序很大,修改的地方也很多,这时,运用本发明的算法可快速标识出源程序的增删改部分,提高了工作效率。
Claims (3)
1.一种大字符串匹配方法,按以下步骤进行:
a)在需要匹配的两个大的字符串M、N中选择一个特征字符或字
符串序列,根据特征字符或字符串序列对所要匹配的两个字符
串分别分段,得到{Mi},{Nj},用散列变换方法计算每段小字符
串Mi和Nj的散列值,以散列值为元素组成变换序列(ai,bi)和
(cj,dj),这样把需要匹配的两个大的字符串分别变换成序列{(ai,bi)}
以及{(cj,dj)};
b)然后对序列{(ai,bi)}、{(cj,dj)}按照ai=cj并且bi=dj为条件进行匹
配,标记出匹配项;
c)序列{(ai,bi)}、{(cj,dj)}中匹配和不匹配所对应的段分别处理,其
中匹配项对应的小字符串段进行字符串匹配,并进一步标记出
小字符串段中的匹配和非匹配内容并输出匹配和非匹配内容;
做为粗匹配,非匹配项对应的小字符串段全部作为非匹配内容
输出;做为细匹配,可以对各个非匹配段进行进一步匹配,找
出更多的匹配内容。
2.按权利要求1所述的一种大字符串匹配方法,其特征在于:所述步骤a)中的散列变换采用计算每段小字符串的长度和以及段中各字符累加和的散列计算方式,变换为一对关于段的长度及段中各字符累加和的序列Mi(ai,bi)以及Nj(cj,dj)。
3.按权利要求1或2所述的一种大字符串匹配方法,其特征在于:所述的Mi(ai,bi)与数组Nj(cj,dj)的匹配以及各段小字符串的匹配采用对角线优先匹配方法,按以下步骤进行:a)把需要匹配的两个字符串生成一个矩阵,以矩阵左上角元素,即M(0,0)为起点,b)从起点开始,搜索从该点向右下方向的一个1*1矩阵,检查该点是否匹配,如果是,将该点的右下点作为新的起点,重复步骤(b);c)否则,将该矩形向右下扩大一行和一列,即以矩形右下角的点的右下点作为新的矩形右下角,在矩形内部搜索匹配点,如果找到,则以该点的右下点为新的起点,转回步骤(b)继续搜索;d)如果没有找到,重复步骤(c),直到搜索达到矩阵的边界为止,搜索结束;e)标记步骤(a)-(d)中搜索到的匹配点,就是两个数组或字符串的匹配部分。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 02134428 CN1392497A (zh) | 2002-07-24 | 2002-07-24 | 大字符串匹配方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 02134428 CN1392497A (zh) | 2002-07-24 | 2002-07-24 | 大字符串匹配方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN1392497A true CN1392497A (zh) | 2003-01-22 |
Family
ID=4747744
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN 02134428 Pending CN1392497A (zh) | 2002-07-24 | 2002-07-24 | 大字符串匹配方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN1392497A (zh) |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2008119297A1 (fr) * | 2007-04-02 | 2008-10-09 | Guangyao Ding | Procédé pour rechercher une chaîne de caractères selon des paramètres caractéristiques |
CN102006582A (zh) * | 2010-12-06 | 2011-04-06 | 南京朗睿软件科技有限公司 | 一种数据匹配方法及系统 |
CN101420440B (zh) * | 2008-12-05 | 2011-08-24 | 华为技术有限公司 | 字符串匹配处理方法及装置 |
CN105141583A (zh) * | 2015-07-28 | 2015-12-09 | 中国电子科技集团公司第三十六研究所 | 一种字符串匹配方法和系统 |
CN106919542A (zh) * | 2015-12-24 | 2017-07-04 | 北京国双科技有限公司 | 规则匹配方法及装置 |
CN109002423A (zh) * | 2017-06-06 | 2018-12-14 | 北大方正集团有限公司 | 文本搜索方法及装置 |
CN111090982A (zh) * | 2018-10-24 | 2020-05-01 | 迈普通信技术股份有限公司 | 文本比较方法、装置、电子设备及计算机可读存储介质 |
CN111581461A (zh) * | 2020-06-19 | 2020-08-25 | 腾讯科技(深圳)有限公司 | 字符串搜索方法、装置、计算机设备及介质 |
-
2002
- 2002-07-24 CN CN 02134428 patent/CN1392497A/zh active Pending
Cited By (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2008119297A1 (fr) * | 2007-04-02 | 2008-10-09 | Guangyao Ding | Procédé pour rechercher une chaîne de caractères selon des paramètres caractéristiques |
CN101420440B (zh) * | 2008-12-05 | 2011-08-24 | 华为技术有限公司 | 字符串匹配处理方法及装置 |
CN102006582A (zh) * | 2010-12-06 | 2011-04-06 | 南京朗睿软件科技有限公司 | 一种数据匹配方法及系统 |
CN102006582B (zh) * | 2010-12-06 | 2013-07-31 | 南京朗睿软件科技有限公司 | 一种数据匹配方法及系统 |
CN105141583A (zh) * | 2015-07-28 | 2015-12-09 | 中国电子科技集团公司第三十六研究所 | 一种字符串匹配方法和系统 |
CN105141583B (zh) * | 2015-07-28 | 2019-02-15 | 中国电子科技集团公司第三十六研究所 | 一种字符串匹配方法和系统 |
US10796077B2 (en) | 2015-12-24 | 2020-10-06 | Beijing Gridsum Technology Co., Ltd. | Rule matching method and device |
CN106919542A (zh) * | 2015-12-24 | 2017-07-04 | 北京国双科技有限公司 | 规则匹配方法及装置 |
CN106919542B (zh) * | 2015-12-24 | 2020-04-21 | 北京国双科技有限公司 | 规则匹配方法及装置 |
CN109002423A (zh) * | 2017-06-06 | 2018-12-14 | 北大方正集团有限公司 | 文本搜索方法及装置 |
CN111090982A (zh) * | 2018-10-24 | 2020-05-01 | 迈普通信技术股份有限公司 | 文本比较方法、装置、电子设备及计算机可读存储介质 |
CN111581461A (zh) * | 2020-06-19 | 2020-08-25 | 腾讯科技(深圳)有限公司 | 字符串搜索方法、装置、计算机设备及介质 |
CN111581461B (zh) * | 2020-06-19 | 2023-04-25 | 腾讯科技(深圳)有限公司 | 字符串搜索方法、装置、计算机设备及介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
AU772525B2 (en) | A search system and method for retrieval of data, and the use thereof in a search engine | |
Sadakane | Compressed suffix trees with full functionality | |
Wu et al. | A fast algorithm for multi-pattern searching | |
Sadakane | A fast algorithm for making suffix arrays and for Burrows-Wheeler transformation | |
Grossi et al. | Compressed suffix arrays and suffix trees with applications to text indexing and string matching | |
Baeza-Yates | Introduction to Data Structures and Algorithms Related to Information Retrieval. | |
Liu et al. | Large scale hamming distance query processing | |
KR20060002792A (ko) | 스트링들을 검색하기 위한 방법 및 배열 | |
Ferragina et al. | A fully-dynamic data structure for external substring search | |
Louza et al. | External memory generalized suffix and LCP arrays construction | |
CN1392497A (zh) | 大字符串匹配方法 | |
Sadakane et al. | Indexing huge genome sequences for solving various problems | |
Lewenstein et al. | Space-efficient string indexing for wildcard pattern matching | |
CN1776688A (zh) | 一种字符数据的检索方法 | |
Sharapova et al. | The problem of fuzzy duplicate detection of large texts | |
Woon et al. | A support-ordered trie for fast frequent itemset discovery | |
Giancarlo | The suffix of a square matrix, with applications | |
Fischer et al. | Fast frequent string mining using suffix arrays | |
Martayan et al. | Conway–Bromage–Lyndon (CBL): an exact, dynamic representation of k-mer sets | |
Lewenstein et al. | Less space: Indexing for queries with wildcards | |
Tharp et al. | The practicality of text signatures for accelerating string searching | |
CN111026862A (zh) | 一种基于形式概念分析技术的增量式实体摘要方法 | |
Hyyrö et al. | Dynamic edit distance table under a general weighted cost function | |
CN113468864A (zh) | 一种长文档的快速比对方法、装置和存储介质 | |
Lo et al. | The numeric indexing for music data |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C12 | Rejection of a patent application after its publication | ||
RJ01 | Rejection of invention patent application after publication |