- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据结构复习笔记-字符串模式匹配算(KMP).pdf
字符串模式匹配算法(KMP)
简单匹配算法
基本的模式匹配算法:以主串的某个字符与子串的第一个字符相比较,若相等,则继续
比较二者的后一个字符,否则主串的字符指针从开始与子串第一个字符比较处后移一个位
置,而子串的字符指针重新指向子串的第一个字符。
当这样一个失配发生时,T下标必须回溯到开始,S下标回溯的长度与T相同,然后S
下标增1,然后再次比较。如图:
这次立刻发生了失配,T下标又回溯到开始,S下标增1,然后再次比较。如图:
又一次发生了失配,所以T下标又回溯到开始,S下标增1,然后再次比较。这次T中的
所有字符都和S中相应的字符匹配了。函数返回T在S中的起始下标4。如图:
上述通过4次匹配,终于在S串中“查找”到T串,位置时4。
提出问题:在第一趟比较后,进行的第二趟、第三趟比较有必要吗?
第一趟后,当S[6]≠T[6]时,
第二趟进行S[2]与T[1]比较是必要的吗?
第三趟进行S[3]与T[1]比较是必要的吗?
第四趟进行S[4]与T[1]比较是必要的吗?
1
第四趟进行S[4]与T[2]比较是必要的吗?
如果是不必要的,那么第一趟后,当S[6]≠T[6]时,
S[6]与T[ ?]比较是必要的呢!
解决问题:引入“KMP匹配算法”
KMP 匹配算法
KMP算法:KMP算法是对传统模式匹配算法的较大改进,在传统的模式匹配算法中,当出现
主串中的字符与子串中的字符不等时,同时向前回溯了两个指针,一个是主串的指针,一个
是子串的指针。而KMP算法的基本思路是在不回溯主串的指针,而只回溯子串的指针的情况
下完成模式匹配,这样就省去了回溯主串指针进行比较的一部分时间。
KMP算法的核心思想是利用已经得到的部分匹配信息来进行后面的匹配过程。
还是相同的例子,在S=”abcabcabdabba”中查找T=”abcabd”,如果使用KMP匹配算
法,当第一次搜索到S[6] 和T[6]不等后,S下标不是回溯到2,T下标也不是回溯到开始,
而是根据T中T[6]==’d’的模式函数值(next[6]=3,为什么?后面讲),直接比较S[6] 和
T[3]是否相等,因为相等,S和T的下标同时增加;因为又相等,S和T的下标又同时增加。。。
最终在S中找到了T。如图:
next[6]=3含义: 其实这个3表示T[6]==’d’的前面有2个字符和开始的两个字符相同”。
请看图 :因为,S[5]==T[5],S[4]==T[4],根据next[6]=3,有T[4]==T[1],T[5]==T[2],
所以S[4]==T[1],S[5] ==T[2](两对相当于间接比较过了),因此,接下来比较S[6] 和
T[3]是否相等。
有人可能会问:S[4]和T[1],S[5] 和T[2]是根据next[6]=3间接比较相等,那S[2]
和T[1],S[3] 和T[1]之间又是怎么跳过,可以不比较呢?因为S[1]=T[1],S[2]=T[2],
S[3]=T[3],而T[1] != T[2], T[2] != T[3],== S[1] != S[2],S[2] != S[3],所
以S[2] != T[1],S[3] != T[1]. 还是从理论上间接比较了。
2
怎么求串的模式值 next[n]
定义 :
0 如果j=1
next[j]={ Max{k|1kj且p...p =p ...p
1 k-1 j-k+1 j-1
1 其它情况
(1)next[1]=0 意义:任何串的第一个字符的模式值规定为0。
(2)next[j]=k 意义:模式串T中下标为j的字符,如果j的前面k-1个字符与
开头的k-1个字符相等,
即: T[1]T[2]……T[k-1] == T[j-k+1]T[j-k+2]…
T[j-1]
(3)next[j
您可能关注的文档
最近下载
- 《现代家政基础》 项目六 现代家庭安全.pptx
- 高考思想政治一轮总复习精品课件 选必3 逻辑与思维 第三单元 运用辩证思维方法-第九课 理解质量互变.ppt VIP
- 临床营养科建设与管理指南(试行).doc VIP
- 2025年中考复习必背外研版初中英语单词词汇(精校打印) .pdf VIP
- 年产55万吨环氧乙烷乙二醇车间环氧乙烷合成工段工艺设计.doc VIP
- 食堂食材配送采购投标方案(技术标).doc
- 临床常用200种常用中药饮片排名.docx VIP
- 德力西850W交流角磨机说明书.pdf VIP
- 2025年四川省内江市中考数学试卷.docx VIP
- 【完整升级版】电力施工组织设计施工方案.doc
文档评论(0)