前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >KMP算法:关于各个步骤的疑惑和思考

KMP算法:关于各个步骤的疑惑和思考

作者头像
执生
发布2020-09-27 10:48:12
3760
发布2020-09-27 10:48:12
举报
文章被收录于专栏:立权的博客立权的博客

KMP看书是很难懂的......相信我,推荐一个易懂视频

https://www.bilibili.com/video/BV1jb411V78H?from=search&seid=9395428282072905815

1.为什么只用研究模式串?因为发生不匹配时,模式串当前下标之前的内容和被查找串的内容是相同的。

2.为什么移动方法不是下面的移动法1,而是移动法2?移动法1的思路是:既然原初不匹配情况下,当前位置之前有相同的前缀(黄色和红色),那么可以直接在开头跳过对红色部分的检索,因为黄色部分已经匹配了,红黄相同就可以直接跳过。

因为移动法1是在被查找串中查找模式串的一部分而已,而不是在被查找串里搜索模式串

3.上述的移动法2,不会跳过可能匹配的部分么?

之前我们说过,只用研究模式串,在原初不匹配情况下,当前位置之前的内容和被查找串对应部分是相同的。

那么就假设红色部分之前可能有匹配的部分吧,但是一个字符一个字符地移动串,会发现如果匹配的话,必须要和黄色部分相同才行,而和黄色部分相同的,也只有红色部分了。

4.为什么红色部分的末尾是挨着当前位置的(出现不匹配情况的下标)?

假设不是挨着的,如下图,从前往后找,找到一个和红色部分匹配的红色部分。

秉承红色的已经匹配了,那么黄色的就不用比较了的思想(黄色和红色相同),把黄色部分移到红色部分。

直接接着比较的话,就会有遗漏,而被遗漏的部分不一定和模式串相同

5.为什么要找最长的公共前缀?

因为如果找的不是最长前缀,那么可能跳过匹配的情况,比如下图直接找 黄色和红色做为公共前缀并且移动的话,就跳过了绿色的B,违背了

上述的 第3点 :移动过程中不能有和模式串开头相同的部分。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-06-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档