CN110909214A - 基于kmp匹配算法的字符串快速匹配方法 - Google Patents
基于kmp匹配算法的字符串快速匹配方法 Download PDFInfo
- Publication number
- CN110909214A CN110909214A CN201911120073.3A CN201911120073A CN110909214A CN 110909214 A CN110909214 A CN 110909214A CN 201911120073 A CN201911120073 A CN 201911120073A CN 110909214 A CN110909214 A CN 110909214A
- Authority
- CN
- China
- Prior art keywords
- string
- character
- matching
- mode
- prefix
- 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
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/903—Querying
- G06F16/90335—Query processing
- G06F16/90344—Query processing by using string matching techniques
Landscapes
- Engineering & Computer Science (AREA)
- Databases & Information Systems (AREA)
- Theoretical Computer Science (AREA)
- Computational Linguistics (AREA)
- Data Mining & Analysis (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了基于KMP匹配算法的字符串快速匹配方法,涉及数据处理技术领域。本发明包括将模式串最后一个字符x与文本串进行匹配;若字符x匹配失败;采用坏字符规则移动;若字符x匹配时;采用模式串前缀与文本串比较,若模式串前缀与文本串同配,则字符串找到;若失配,则根据KMP算法得到模式串右移的距离使模式串在新位置进行一下轮的匹配。本发明通过将模式串最后一个字符x与文本串进行匹配;若字符x匹配失败;采用坏字符规则移动;若字符x匹配时;采用模式串前缀与文本串比较;降低字符匹配时间复杂度,提高匹配效率。
Description
技术领域
本发明属于数据处理技术领域,特别是涉及一种基于KMP匹配算法的字符串快速匹配方法。
背景技术
字符串匹配阵是数字处理过程中的基本问题,实际上是字符的模式匹配,即在给定的文本串中找出与模式串匹配的子串的起始位置。最基本的串匹配问题是关键词匹配;所谓关键词匹配,是指给定一个长为n的文本串T[1,n]和长为m的模式串P[1,m],找出文本串T中与模式串所有精确匹配的子串的起始位置。
常见的字符匹配算法包括BF算法;BF算法思想是从文本串的第一个字符开始和模式串进行匹配;若匹配成功,则继续比较后面的字符;否则文本串指针回溯到后一个位置从第二个字符开始和模式串第一个字符进行匹配。依此下去,直到和模式串匹配成功或到文本串的末尾为止。它的时间复杂度一般情况下为O((n-m+1)m)其中:n和m分别为主串和模式串的长度,最坏的情况下为O(m*n),最好的情况下为O(m+n);基于BF算法的时间复杂度明显较高,字符匹配效率较低。
KMP模式匹配算法针对BF算法做了改进;其基本思想是:设计一个与模式串本身局部匹配信息构造的模式值数组next,当匹配过程中出现失配时,利用模式值将模式串向右“滑动”尽可能远的一段距离了,从而跳过一些不必要的比较以提高模式匹配的效率。例如:对给出的的文本串T[0,n-1]与模式串P[0,m-1],假设在模式匹配的进程中,执行T[i]和P[j]的匹配检查;若T[i]=P[j],则继续检查T[i+1]和P[j+1]是否匹配;若T[i]≠P[j],则分成两种情况:若j=0,则模式串右移一位,检查T[i+1]和P[0]是否匹配;若1≤j<m,则模式串右移j-next(j)位,检查T[i]和P[next(j)]是否匹配。重复此过程直到j=m-1或i=n-1结束;该算法的时间复杂度为O(m+n)。
而BM算法包含两个并行的规则,坏字符规则和好后缀规则,这两种规则的目的就是让模式串在失配时,向右移动尽可能大的距离;设文本串为T[0,n-1],模式串为P[0,m-1],坏字符规则:即是在文本串T与模式串P从右向左匹配过程中,主串中的字符x与P[j]位置字符不匹配,如果这个字符x在模式串P[0,j]中没有出现,直接跳过P[0,j]如果x在P[0,j]中出现,移动P使x字符对齐。好后缀规则:当出现不匹配字符时,已有部分字符P[j,m-1]匹配成功,如果P[j,m-1]在P[0,j]的某位置k(k<j)也出现,且P[k-1]≠P[j-1],则将P[k-1]移到P[j-1]位置;如果P[j,m-1]在P[0,j]没有出现,则找到与P[j,m-1]的后缀相同的最长前缀,移动P使之对齐。BM进行模式匹配时,将文本串T与模式串P进行左对齐,然后进行从右向左比较,一旦发现不匹配,通过查询预处理好的坏字符移动表与好后缀移动表,选择移动距离较大值向后移动模式串P,再进行下一轮匹配尝试。BM算法预处理阶段时间复杂度为O(m+s)(s为与模式串P和文本串T相关的有限字符集长度),搜索阶段的时间复杂度为O(mn)。
进行搜索实践时,常常遇到一部分前缀匹配而后缀却不匹配,或后缀匹配而前缀不匹配的情况,这就进行了许多次不必要的比较。因此,亟需一种时间复杂度低的字符串匹配方法,以解决现有字符匹配时间复杂度高、效率低的问题。
发明内容
本发明的目的在于提供基于KMP匹配算法的字符串快速匹配方法,通过将模式串最后一个字符x与文本串进行匹配;若字符x匹配失败;采用坏字符规则移动;若字符x匹配时;采用模式串前缀与文本串比较;降低字符匹配时间复杂度,提高匹配效率。
为解决上述技术问题,本发明是通过以下技术方案实现的:
本发明为基于KMP匹配算法的字符串快速匹配方法,包括如下步骤:
将模式串最后一个字符x与文本串进行匹配;
若字符x匹配失败;采用坏字符规则移动;
若字符x匹配时;
采用模式串前缀与文本串比较,若模式串前缀与文本串同配,则字符串找到;若失配,则根据KMP算法得到模式串右移的距离使模式串在新位置进行一下轮的匹配;
当字符x在模式串前缀中出现,而模式串在这个新位置并未使主串的字符x与模式串前缀中出现的字符x对齐,则向右增大模式串的移动距离,使主串中的字符x与模式串前缀中出现的字符x对齐,然后再进行比较;
若字符x并未在模式串前缀中出现,采用好字符规则直接跳过该区域获得最大的右移距离。
优选地,所述好字符规则还需增加一个好字符数组GC以记录模式串最末字符在字符串前缀中出现的位置信息;所述好字符数组GC与模式串长度一致。
优选地,还包括如下:
所述文本串进行全文扫描时分为末字符匹配和前缀匹配两部分,首先在index位置对模式串P最末字符x进行匹配;
若失配,则直接取坏字符表值移动字符串在下一个位置进行比较;
若同配,则匹配模式串前缀,若所述前缀也同配,则字符串找到;当所述前缀j位置失配,则求出由KMP算法模式值next决定的移动距离,再访问好字符数组GC,计算模式串P的最大移动距离。
本发明具有以下有益效果:
本发明通过将模式串最后一个字符x与文本串进行匹配;若字符x匹配失败;采用坏字符规则移动;若字符x匹配时;采用模式串前缀与文本串比较;降低字符匹配时间复杂度,提高匹配效率。
当然,实施本发明的任一产品并不一定需要同时达到以上所述的所有优点。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明的基于KMP匹配算法的字符串快速匹配方法的流程图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
请参阅图1所示,本发明为基于KMP匹配算法的字符串快速匹配方法,包括如下步骤:
将模式串最后一个字符x与文本串进行匹配;
若字符x匹配失败;采用坏字符规则移动;
若字符x匹配时;
采用模式串前缀与文本串比较,若模式串前缀与文本串同配,则字符串找到;若失配,则根据KMP算法得到模式串右移的距离使模式串在新位置进行一下轮的匹配;
当字符x在模式串前缀中出现,而模式串在这个新位置并未使主串的字符x与模式串前缀中出现的字符x对齐,则向右增大模式串的移动距离,使主串中的字符x与模式串前缀中出现的字符x对齐,然后再进行比较;
若字符x并未在模式串前缀中出现,采用好字符规则直接跳过该区域获得最大的右移距离。
其中,好字符规则还需增加一个好字符数组GC以记录模式串最末字符在字符串前缀中出现的位置信息;好字符数组GC与模式串长度一致;
具体的建立数组GC的算法描述如下:
其中,还包括如下:
文本串进行全文扫描时分为末字符匹配和前缀匹配两部分,首先在index位置对模式串P最末字符x进行匹配;
若失配,则直接取坏字符表值移动字符串在下一个位置进行比较;
若同配,则匹配模式串前缀,若前缀也同配,则字符串找到;当前缀j位置失配,则求出由KMP算法模式值next决定的移动距离,再访问好字符数组GC,计算模式串P的最大移动距离;
具体的实现如下:
while(T[i+Plen-1]!='\0')
//文本串均未越界
{
if(T[index+Plen-1]!=P[Plen-1])
{
shift=Plen-1-bc[(unsigned int)T[index+Plen-1]];index+=shift;
i=index;
}
else
{//最末字符匹配成功while(T[i]==P[j]&&j<Plen-1)//匹配前缀
{i++;j++;}
if(j<Plen-1)
{//前缀匹配失败,据好字符数组移动模式串
shift=j-next[j];i=i+shift+GC[Plen-1-shift];j=0;
index=i;
}
else
{return index;//前缀匹配成功}
}
}。
值得注意的是,上述***实施例中,所包括的各个单元只是按照功能逻辑进行划分的,但并不局限于上述的划分,只要能够实现相应的功能即可;另外,各功能单元的具体名称也只是为了便于相互区分,并不用于限制本发明的保护范围。
另外,本领域普通技术人员可以理解实现上述各实施例方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,相应的程序可以存储于一计算机可读取存储介质中。
以上公开的本发明优选实施例只是用于帮助阐述本发明。优选实施例并没有详尽叙述所有的细节,也不限制该发明仅为所述的具体实施方式。显然,根据本说明书的内容,可作很多的修改和变化。本说明书选取并具体描述这些实施例,是为了更好地解释本发明的原理和实际应用,从而使所属技术领域技术人员能很好地理解和利用本发明。本发明仅受权利要求书及其全部范围和等效物的限制。
Claims (3)
1.基于KMP匹配算法的字符串快速匹配方法,其特征在于,包括如下步骤:
将模式串最后一个字符x与文本串进行匹配;
若字符x匹配失败;采用坏字符规则移动;
若字符x匹配时;
采用模式串前缀与文本串比较,若模式串前缀与文本串同配,则字符串找到;若失配,则根据KMP算法得到模式串右移的距离使模式串在新位置进行一下轮的匹配;
当字符x在模式串前缀中出现,而模式串在这个新位置并未使主串的字符x与模式串前缀中出现的字符x对齐,则向右增大模式串的移动距离,使主串中的字符x与模式串前缀中出现的字符x对齐,然后再进行比较;
若字符x并未在模式串前缀中出现,采用好字符规则直接跳过该区域获得最大的右移距离。
2.根据权利要求1所述的基于KMP匹配算法的字符串快速匹配方法,其特征在于,所述好字符规则还需增加一个好字符数组GC以记录模式串最末字符在字符串前缀中出现的位置信息;所述好字符数组GC与模式串长度一致。
3.根据权利要求1所述的基于KMP匹配算法的字符串快速匹配方法,还包括如下:
所述文本串进行全文扫描时分为末字符匹配和前缀匹配两部分,首先在index位置对模式串P最末字符x进行匹配;
若失配,则直接取坏字符表值移动字符串在下一个位置进行比较;
若同配,则匹配模式串前缀,若所述前缀也同配,则字符串找到;当所述前缀j位置失配,则求出由KMP算法模式值next决定的移动距离,再访问好字符数组GC,计算模式串P的最大移动距离。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911120073.3A CN110909214A (zh) | 2019-11-15 | 2019-11-15 | 基于kmp匹配算法的字符串快速匹配方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911120073.3A CN110909214A (zh) | 2019-11-15 | 2019-11-15 | 基于kmp匹配算法的字符串快速匹配方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN110909214A true CN110909214A (zh) | 2020-03-24 |
Family
ID=69816504
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201911120073.3A Pending CN110909214A (zh) | 2019-11-15 | 2019-11-15 | 基于kmp匹配算法的字符串快速匹配方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110909214A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113836367A (zh) * | 2021-09-26 | 2021-12-24 | 杭州迪普科技股份有限公司 | 一种字符反向匹配的方法及装置 |
CN117668527A (zh) * | 2024-01-31 | 2024-03-08 | 国网湖北省电力有限公司信息通信公司 | 一种大流量模型下的多特征识别方法及*** |
-
2019
- 2019-11-15 CN CN201911120073.3A patent/CN110909214A/zh active Pending
Non-Patent Citations (2)
Title |
---|
叶煜: "一种基于KMP的高效字符串匹配算法", 《西南民族大学学报(自然科学版)》 * |
蔡婷等: "一种改进的字符串模式匹配算法", 《物联网技术》 * |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113836367A (zh) * | 2021-09-26 | 2021-12-24 | 杭州迪普科技股份有限公司 | 一种字符反向匹配的方法及装置 |
CN113836367B (zh) * | 2021-09-26 | 2023-04-28 | 杭州迪普科技股份有限公司 | 一种字符反向匹配的方法及装置 |
CN117668527A (zh) * | 2024-01-31 | 2024-03-08 | 国网湖北省电力有限公司信息通信公司 | 一种大流量模型下的多特征识别方法及*** |
CN117668527B (zh) * | 2024-01-31 | 2024-04-26 | 国网湖北省电力有限公司信息通信公司 | 一种大流量模型下的多特征识别方法及*** |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9768802B2 (en) | Look-ahead hash chain matching for data compression | |
US5406278A (en) | Method and apparatus for data compression having an improved matching algorithm which utilizes a parallel hashing technique | |
US5049881A (en) | Apparatus and method for very high data rate-compression incorporating lossless data compression and expansion utilizing a hashing technique | |
US5371499A (en) | Data compression using hashing | |
Bowe et al. | Succinct de Bruijn graphs | |
KR100950607B1 (ko) | 허프만 코딩 | |
CN109977276B (zh) | 一种基于Sunday算法改进的单模式匹配方法 | |
US10224957B1 (en) | Hash-based data matching enhanced with backward matching for data compression | |
US7199729B2 (en) | Character code conversion methods and systems | |
US9916314B2 (en) | File extraction method, computer product, file extracting apparatus, and file extracting system | |
JPWO2004062110A1 (ja) | データ圧縮方法、プログラム及び装置 | |
CN104268157A (zh) | 一种数据搜索中的纠错装置及其方法 | |
WO2017128763A1 (zh) | 数据压缩装置及方法 | |
US20050187898A1 (en) | Data Lookup architecture | |
CN110909214A (zh) | 基于kmp匹配算法的字符串快速匹配方法 | |
CN106599097B (zh) | 海量特征串集合的匹配方法和装置 | |
CN116562297B (zh) | 基于HTrie树的中文敏感词变形体识别方法及*** | |
CN114647764B (zh) | 图结构的查询方法、装置及存储介质 | |
CN108628907A (zh) | 一种用于基于Aho-Corasick的Trie树多关键词匹配的方法 | |
CN107220333B (zh) | 一种基于Sunday算法的字符搜索方法 | |
CN108628953A (zh) | 一种基于fpga的并行字符串匹配算法 | |
Okanohara et al. | An online algorithm for finding the longest previous factors | |
CN108399152B (zh) | 数字查找树的压缩表示方法、***、存储介质及规则匹配装置 | |
CN113407693B (zh) | 一种用于全媒体审读的文本相似度比对方法及装置 | |
CN109657108B (zh) | 一种域名资产数据存储和查询方法和*** |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20200324 |