有关串的模式匹配问题中的kmp算法(俗称 看毛片算法)

========前言======

最近准备考研,于是重新拾起数据结构这本书(严老师的) 对于之前的看毛片算法想用自己的方式重新总结一下


========没有这方面基础的先看 这个网址

     (该网址为百度百科 本人只分享跟链接 若有其他影响本人概不负责)   https://baike.baidu.com/item/kmp%E7%AE%97%E6%B3%95/10951804?fr=aladdin

========BUT=======

算法的学习主要是看个人自己的理解与抽想 ,我的理解可能大家觉得比较难以理解,没事,千人千面,欢迎大家在下面补撑自己的看法

===========KMP=======

KMP里面最主要的就是理解为什么要将模式串进行最长前缀与最长后缀的查找(或者是为什么要去求一个(next[]数组))

1.在之前的暴力匹配中 会有主串的指针回溯 就是指主串会从上一次比较的字符的下一个字符再与模式串的第一个字符比较,以此类推,会有很多不必要的比较(明知道会匹配失败)--------原因是没有引入最长前缀最长后缀之前,我们只是一味的将模式串的前几个字符与指针不断回溯的主串的字串进行比较,在遇见匹配成功之前总会有可能匹配失败   就像是我们不去了解自己女朋友(模式串)一样,一味的拿她去比较(是不是很多直男的心声 虽然木有女朋友 呸) 总会出错。

于是重点来嘞!

我们应该先挖掘女朋友的特点(模式串的特点) 让匹配时少走弯路 

扫描二维码关注公众号,回复: 3613879 查看本文章

例如 主串  abcfgabcdabcfgabcbfd

     模式串 abcfgabcb

其中如上所示 标蓝的是匹配成功的 而绿色就是所谓的最长前后缀

我们的女朋友在b(标黑的地方)匹配失败 !

之前暴力匹配时 会从主串的第二个字符开始(假设一开始从主串第一个开始比较,黑色时怕匹配失败)

会有很多不必要的比较 

因为我们引入最长前后缀可以看出 主串第二个位置到第四个位置没有匹配上的(abc)这就增加了很多不必要的比较、

那么明知会失败 我们为什么不去避免这些?

=======kmp登场========

引入最长前后缀之后 我们可以知道 当匹配失败时 我们应该将模式串向右移动一定长度 减少不必要的匹配(明知道肯定会失败的匹配) 


    模式串 abcfgabcb 移动多少个合适??答案是 移动 abcfgabc .length()-abc.length()

   此时前缀移动到后缀  

  那么有人会问有没有可能移动 小于 abcfgabc .length()-abc.length()个位置就能匹配上?也就是说移动过程中会不会漏掉能够成功的串? 答案是 不会的!!

我们引入最长前后缀后 会有新的条件产生 

新的条件:模式串标记绿色的部分 在主串已匹配过的子串中能够找到 我们现在应该考虑的是怎样让模式串前后缀重逢(或者是让模式串的前缀与主串中已经匹配串的后缀重逢)只要让他们重逢就能省去不必要的匹配    像上述模式串需要移动8-3=5个位置 有没有一个可能移动小于五个就重逢(模式串移动小于5个位置的时候会不会遇到跟前缀一样的子串)?

我们用数学的假设思想:

1 假设移动两个遇见了

那么此时 如图:

   

还是符合公式 也就是说你所谓的会在移动中碰见 并不会出现在该串中 而会出现在别的类型的特定模式串(特定的最长前后缀长度)中,但该特定模式串还是会遵循这个公式。

总结也就是 说   你找到的最长前后缀是唯一的 他们只能在模式串中仅有一处碰到 最长前缀只能碰到最长后缀!!!!!!

所以 不要在这个问题上耗费时间啦 同基们!!!!



猜你喜欢

转载自blog.csdn.net/wanglin_ni_ge/article/details/80000452
今日推荐