KMP算法笔记

KMP算法通过记录最长公共前后缀来提高字符串匹配效率,避免了暴力回溯。本文介绍了KMP算法的核心思想,即在不匹配时能一次性移动多位,并详细阐述了next表的重要性及构建方法,指出构建next表的算法优化对于性能的影响。
摘要由CSDN通过智能技术生成

原理暂且不多赘述。

主串mstr
子串sstr

场景:
某一轮比较中,从某个位置开始(如mstr[k1]对应sstr[p1]),主串、子串逐位进行比较,一直匹配,直到发现mstr[k2] 的值与sstr[p2] 处的值不再匹配时,需要对子串进行移动。
KMP算法提升性能的核心就在这里:
BF算法是每次移动一位,并且主串和子串的游标都需要回溯,重新从mstr[k1+1]和sstr[p1+1]开始下一轮比较()
而KMP算法可以做到一次性移动多位(只要符合条件)。

简要叙述,就是在某一轮的比较过程中,记录已经匹配部分的串信息,从而进行判定是否能够一次性移动多位。我们发现,只要前缀和后缀有公共部分,那么这一部分可以直接作为已经匹配过的部分串使用。

核心信息:

  1. 每个位置对应的最长公共前后缀长度。
  2. 前缀移动到后缀位置。(替代之前的每次只移动一位。)

于是工作重点就是信息记录,KMP算法表现为next表,将每个位置对应的最长公共前后缀长度记录在对应下标的next数组中,以便编码时实现**“跨越式移动”**。(next表的人工计算较为直观,此处暂不赘述。其核心难度在于,不易编码实现。)
如何构建next表就是编码的核心。倘若算法不佳,依旧会造成性能浪费。

对于next表的构建,一个不那么糟糕的算法,其实是类似于拿子串本身去与子串本身再使用KMP。

核心在于next表的求法。

相对晦涩的代码:

void getNextHS(string str, int *next){
                     // next[k]的值,指的是模板串游标处于k位置时,如果发生不匹配,则可以将游标直接移动到的目标位置。
    int len =str.size();                                // 同时也是模板串中,k位置之前的部分串中,最长公共前后缀的长度。(数组从0开始,若从1开始要加1)
    next[0] = -1;                                       // 之所以将长度和直接移动的目标位置对等起来,是因为前缀是从0开始的。
    int i=0,j=-1;
    while(i < len - 1){
                                    // 寻找模板串的公共前后缀,不能是模板串本身,因此前缀串的下标i不能到len-1.
        if(j == -1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值