当前位置:   article > 正文

【数据结构与算法】字符串匹配 KMP 算法_失效函数和next数组有区别吗

失效函数和next数组有区别吗
  1. 单模式串匹配
    BF 算法和 RK 算法
    BM 算法和 KMP 算法
  2. 多模式串匹配算法
    Trie 树和 AC 自动机

KMP 算法

KMP 算法是根据三位作者(D.E.Knuth,J.H.Morris 和 V.R.Pratt)的名字来命名的,算法的全称是 Knuth Morris Pratt 算法,简称为 KMP 算法。

思想

1,KMP算法的核心思想,与BM算法非常相近。假设主册是a,模式串是b。再模式串与主串匹配的过程中,当遇到不可匹配的字符的时候,找到一些规律,将模式串往后多滑动几位,跳过肯定不会匹配的情况。
2,当遇到坏字符的时候,我们就要把模式串往后滑动,在滑动的过程中,只要模式串和好前缀有上下重合,前面几个字符的比较,就相当于拿好前缀的后缀子串,跟模式串的前缀子串在比较。
3,KMP算法就是试图寻找一种规律:在模式串和主串匹配的过程中,当遇到坏字符后,对于已经对过的好前缀,将模式串一次性滑动很多位?
4,我们只需要拿好前缀本身,在它的后缀子串中,查找最长的那个可以跟好前缀的前缀子串匹配的。假设最长的可匹配的那部分前缀子串是{v},长度是k。我们把模式串一次性往后滑动j-k位,相当于,每次遇到坏字符的时候,我们就把j更新为k,i不变,然后继续比较。
在这里插入图片描述

5,KMP算法也可以提前构建一个数组,用来存储模式串中每个前缀(这些前缀都有可能是好前缀)的最长可匹配子串的结尾字符下标。将这个数组定义为next数组,很多书中将这个数组起名为**失效函数(failure function)。**next数组的下标是每个前缀结尾字符下标,数组的值是这个前缀的最长可以匹配的前缀子串的结尾字符下标。
在这里插入图片描述

在这里插入图片描述

next数组(失效函数)计算方法

精髓:k = next[k]
因为前一个的最长串的下一个字符不与最后一个相等,需要找前一个的次长串,问题就变成了求0到next(k)的最长串,如果下个字符与最后一个不等,继续求次长串,也就是下一个next(k),直到找到,或者完全没有

①:按照下标从小到大,依次计算next数组的值。当我们要计算next[i]时,前面的next[0],next[1],……,next[i-1]应该已经计算出来了。利用已经计算出来的next值,可以快速推导出next[i]的值。
②:如果next[i-1] = k-1,即子串b[0,k-1]是b[0,i-1]的最长可匹配前缀子串。如果子串b[0,k-1]的下一个字符b[k],与b[0,i-1]的下一个字符b[i]匹配,那子串b[0,k]就是b[0,i]的最长可匹配前缀子串。所以,next[i]等于k。但是,如果b[0,k-1]的下一个字符b[k]跟b[0,i-1]的下一个字符不相等,则需要进一步处理。
在这里插入图片描述

③:假设b[0,i]的最长可匹配后缀子串是b[r,i]。如果把最后一个字符去掉,那b[r,i-1]肯定是b[0,i-1]的可匹配后缀子串,但不一定是最长可匹配后缀子串。所以,既然b[

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/847822
推荐阅读
相关标签
  

闽ICP备14008679号