收藏 分享(赏)

模式匹配KMP算法.ppt

上传人:lxhqcj 文档编号:7281817 上传时间:2019-05-12 格式:PPT 页数:8 大小:553.50KB
下载 相关 举报
模式匹配KMP算法.ppt_第1页
第1页 / 共8页
模式匹配KMP算法.ppt_第2页
第2页 / 共8页
模式匹配KMP算法.ppt_第3页
第3页 / 共8页
模式匹配KMP算法.ppt_第4页
第4页 / 共8页
模式匹配KMP算法.ppt_第5页
第5页 / 共8页
点击查看更多>>
资源描述

1、模式匹配,- KMP算法,模式匹配的一般算法模式匹配:子串的定位操作基本思想:从主串 s 的第一个字符起和模式的第一个字符比较之,若相等,则继续逐个比较后序字符,否则从主串的第二个字符起再重新和模式的字符比较之。依次类推,直至模式 t 中的每个字符依次和主串s 中的一个连续字符序列相等,则称匹配成功,否则匹配不成功。,算法FUNC index_BF(s,t:strtp):integer;求模式串 t 在主串 s 中的位置的定位函数 I:=1; j:=1 指针初始化 while ( I t.curlen THEN RETURN (I-t.curlen ) ELSE RETURN(0) ENDF;

2、 index_BF ,特点 :一般情况下时间复杂度为 O(n+m),最坏的情况下为 O(n*m): 主串中存在多个和模式串“部分匹配”的子串,引起指针 I 的多次回溯。如 模式串为00000001 主串为0000000000000000000000000000000000000000000000000000000000001,模式匹配的改进算法-KMP算法,对普通算法的改进:每当一趟匹配过程中出现字符比较不等时,不需回溯 I 指针,而是利用已经得到的“部分匹配”结果 将模式向右“滑动”尽可能远的一段距离后,继续进行比较。改进算法的匹配过程示例I=3第一趟匹配 a b a b c a b c a

3、 c b a ba b c第二趟匹配 a b a b c a b c a c b a b a b c a c第三趟匹配 a b a b c a b c a c b a ba b c a c,J=6,主串为S1S2Sn, 模式串为P1P2Pm ,为了实现改进算法,需要解决如下问题当主串中的第I 个字符与模式中第J 个字符 比较不等时,主串中第I 字符(指针不回溯)应与模式中哪个字符再比较(模式串向右滑行)?,假设此时应与模式中第K个(k K满足下列关系式:P1P2Pk-1=Si-k+1Si-k+2Si-1因为部分匹配的结果是 Pj-k+1Pj-k+2Pj-1=Si-k+1Si-k+2Si-1所以

4、P1P2Pk-1= Pj-k+1Pj-k+2Pj-1,如何求J对应的K?,若模式串中存在满足上式的两个子串,则当匹配过程中第I 个字符与模式中第J 个字符比较不等时,仅需将模式向右滑动至模式中第K个字符和主串中第I 个字符对齐,若令 next j = k ,则next j 表明当模式中第J个字符与主串中相应字符比较不等时,在模式中需重新和主串中该字符进行比较的字符位置。,KMP算法FUNC index_KMP(s,t:strtp):integer; 利用模式串的next函数求模式串T 在主串 s 中位置的KMP算法 I:=1; j:=1 指针初始化 while ( I t.curlen THE

5、N RETURN (I-t.curlen ) ELSE RETURN(0) ENDF; index_kmp ,如何求模式串next函数?,next 函数的求法,next 函数值仅取决于模式串本身而和相匹配的的主串无关 从定义出发用递推的方法求得 next 函数值:,next 1= 0 next j = k 表明在模式串中 P1P2Pk-1= Pj-k+1Pj-1其中k为满足1k 满足等式。 求 Nextj+1, 若Pk=Pj,则表明在模式串中P1P2Pk= Pj-k+1Pj 不可能存在kk,满足等式 Nextj+1=k+1=next j+1, 若PkPj,则表明在模式串中P1P2Pk Pj-k

6、+1Pj 此时可把next 函数值的问题 看成是一个模式匹配的问题,整个模式串既是主串又是模式串。已有 P1P2Pk-1= Pj-k+1Pj-1 则当PkPj时,应将模式向右滑动至以模式中的第nextk个字符和主串中的第J 个字符相比较。,若Pj=Pnextk,则 nextj+1=next k+1 若Pj Pnextk,则将模式继续向右滑动直至模式中第nextnextk个字符与Pj对齐依次类推,直至Pj 和模式中某个字符匹配成功或者不存在任何K(1 K J)满足部分匹配,则有 nextj+1=1,求next 函数值的算法PROC get-next(t:strtp;VAR next :ARRAY 1t.curlen of integer)求模式串t 的next函数值并存入数组next j:=1; k:=0; next1:=0 初始化 while j= t.curlen DO IF (k=0) OR (t.ch j = t.ch k )THEN j:=j+1; k:=k+1; nextj:=k ELSE k :=next k ENDP; get-next ,虽然一般的模式匹配算法算法的时间复杂度是O(n*m),但一般的情况下,其实际的执行时间近似于O(n+m),至今仍被采用。KMP算法仅当模式串与主串之间存在许多部分匹配的情况下才显得比一般算法快许多。,谢谢指导,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 网络科技 > 数据结构与算法

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报