kmp模式匹配算法探讨论文

kmp模式匹配算法探讨论文

ID:10026928

大小:26.00 KB

页数:5页

时间:2018-05-21

kmp模式匹配算法探讨论文 _第1页
kmp模式匹配算法探讨论文 _第2页
kmp模式匹配算法探讨论文 _第3页
kmp模式匹配算法探讨论文 _第4页
kmp模式匹配算法探讨论文 _第5页
资源描述:

《kmp模式匹配算法探讨论文 》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、KMP模式匹配算法探讨论文KMP模式匹配算法探讨论文  摘要介绍了KMP算法并与朴素查找算法进行了比较,提出了前缀函数的概念,并利用改进的前缀函数改进KMP算法,最后结合KMP的改进算法给出了多次匹配的算法。  关键词串匹配,前缀函数,KMP算法  在计算机科学领域,串的模式匹配算法一直都是研究焦点之一。在拼写检查、语言翻译、数据压缩、搜索引擎、网络入侵检测、计算机病毒特征码匹配以及DNA序列匹配等应用中,都需要进行串匹配。串匹配就是在主串中查找模式串的一个或所有出现。在本文中主串表示为S=s1s2s3…sn,模式串表示为T=t1t2…t

2、m。串匹配从方式上可分为精确匹配、模糊匹配、并行匹配等,著名的匹配算法有BF算法、KMP算法、BM算法及一些改进算法。本文主要在精确匹配方面对KMP算法进行了讨论并对它做一些改进以及利用改进的KMP来实现多次模式匹配。  1KMP算法  最简单的朴素串匹配算法(BF算法)是从主串的第一个字符和模式串的第一个字符进行比较,若相等则继续逐个比较后续字符,否则从主串的第二个字符起再重新和模式串的第一个字符进行比较。依次类推,直至模式串和主串中的一个子串相等,此时称为匹配成功,否则称为匹配失败。朴素模式匹配算法匹配失败重新比较时只能向前移一个字符

3、,若主串中存在和模式串只有部分匹配的多个子串,匹配指针将多次回溯,而回溯次数越多算法的效率越低,它的时间复杂度一般情况下为O((n-m+1)m),最坏的情况下为O(m*n),最好的情况下为O(m+n)。KMP模式匹配算法正是针对上述算法的不足做了实质性的改进。其基本思想是:当一趟匹配过程中出现失配时,不需回溯主串,而是充分利用已经得到的部分匹配所隐含的若干个字符,过滤掉那些多余的比较,将模式串向右“滑动”尽可能远的一段距离后,继续进行比较,从而提高模式匹配的效率,该算法的时间复杂度为O(m+n)。  那么如何确定哪些是多余的比较?在KMP

4、算法中通过引入前缀函数f(x)来确定每次匹配不需要比较的字符,保证了匹配始终向前进行,无须回溯。假设主串为s1s2,sn.,模式串为t1t2,tm.,其中m≦n,从si+1开始的子串遇到一个不完全的匹配,使得:  ()  如果我们能确定一个最小的整数,使得:  ()  其中,所以确定i’’’’等价于确定k,这里的k值就是我们要求的前缀函数f(x)。由式和中K值与主串s无关,只与给定的模式串t中与主串匹配的q有关,即k=f(q),  f(q)=max{i

5、0iq且t[1..i]是t[1..q]的后缀}()  确定KMP前缀函数的算法如下: 

6、 #defineMAXSIZE100  Typedefunsignedcharstring[MAXSIZE+1];//0号单元用来存放串的长度  voidf(sstringt,int*array)  {  m=t[0];//m为当前模式串的长度  array=(int*)malloc((m+1)*sizeof(int));//0号元不用  array[1]=0;k=0;  for(q=2;q  {while(k>0&&t[k+1]!=t[q])k=array[k];  if(t[k+1]==t[q])k=k+1;  array[q]=k;

7、  }  }  关于KMP算法的前缀函数f(x)的示例见表1。  当模式串中有i个字符串匹配成功,第i+1个字符不匹配时,则从i-f(i)个字符重新开始比较,这样不仅无须回溯,而且一次可以向前滑动i-f(i)个字符,大大提高了模式匹配的效率。下面给出朴素匹配算法和KMP匹配算法的比较,见表2。  表2朴素匹配算法和KMP匹配算法比较表  朴素算法KMP算法  时间复杂度O((n-m+1)m)O(m+n)  向前移动字符个数1q-f(q)  回溯次数q-1无  其中:n为主串长度,m为模式串长度,q为匹配成功的字符个数  2KMP算法的改进

8、  在KMP算法的实际应用中,发现该算法也存在着不足,结合下面的表一来论述KMP模式匹配算法的改进。假设模式串前4个字符与主串的第i+1..i+4匹配成功,第5个字符匹配失败,此时前缀函数f(4)=1,下一次匹配将从第i+4开始,并直接将模式串中的第2个字符与主串中的第i+5个字符进行比较,从表1中可知,匹配必将失败,此次比较是多余的。这说明此时的前缀函数f(x)并不是最优,需要对前缀函数进行改进。实质上,所谓对KMP算法的改进就是对其前缀函数的改进。  4结语  本文给出的算法较朴素匹配算法在效率上有了较大的提高,尤其是对重复字符出现较

9、少的数据段进行模式匹配可取得较高的查找效率。应用于大型数据库的数据查询,会更加有效地缩短查找时间。  参考文献  [1]严蔚敏,吴伟民.数据结构[M].清华大学出版社,2001  [2]傅清祥

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。