关于KMP算法的next数组自己的理解

最近重温了KMP算法,顺便记录一下对KMP算法的理解,比较难懂的应该算是next数据的使用了,先说说自己的理解

首先要理解next数组的含义,假设有字符串P_0{}P_1{}P_2{}..........P_{i-1}P_{i},   next[i] = n意味着P_0{}P_1{}.....P_{n-1} = P_{i-n}.....P_{i-1},意思就是在第i个字符串之前的字符串中(不包括第i)数量为n的后缀等于数量为n的前缀。那这个有什么用呢?

假设有字符串S和P,要在S中找到P,当比较P[i]和S[j]不相等时,如果是朴素算法,P回溯到0, S回溯到开始匹配的下一个位置(则i需要回溯到0(i=0)),从P[0]开始继续和S[j]继续比较,但在KMP算法里,P不需要回溯到0,回溯到next[i] = n(n  \leqslant i),S也不需要回溯,为什么要这样呢?因为比较P[i]和S[j]时(i\neq 0j\neq 0),假设P_0{}.....P_{i-1} 为 p , S_{j-i}........S_{j-1}为s,则p=s,根据next的含义,可知P_0{}......P_{n-1}  = S_{j-n}.....S_{j-1},意思就是p的数量为n的前后缀相等,而p又等于s,所以p的前缀等于s的后缀。也就代表着当回溯的时候P的前n个字符串已经S[j]的之前的n个字符相等了,没必要把i赋值为0从P[0]开始进行比较了,也就是省去了再去比较P_0{}......P_{n-1}_{}这一段。例子我也懒得举了,至于next数组怎么算很多博客都有写,在这里我只想记录对next的理解。

def kmp_next(patterm):
    next_arr = [0]
    # prefix_index处在字符串前缀,
    prefix_index = 0
    i = 1
    while i < len(patterm):
        if patterm[i] == patterm[prefix_index]:
            next_arr.append(prefix_index + 1)
            prefix_index += 1
            i +=1
        else:
            # 如果不相等,prefix_index回溯到它的上一个位置
            if prefix_index >= 1:
                prefix_index = next_arr[prefix_index - 1]
                continue
            
            # 如果prefix_index为0说明前缀和后缀没有相同的串
            if prefix_index == 0:
                i+=1
                next_arr.append(0)
                continue

    return next_arr

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值