kmp算法的next数组讲解

本文详细解释了如何通过next数组的计算过程,利用公共前后缀的最大化来确定数组值。重点在于理解`ch[i]==ch[j]`和`elsej=next[j]`的条件在算法中的作用。
摘要由CSDN通过智能技术生成

首先  我们来看一下求next数组的代码

如果我们手算ababa的next的数组的话  我们会得到以下值

我们按照代码的逻辑走一遍

我们会发现得到的和手算的next数组一模一样  为什么呢?

首先 我们需要了解一点 next[j+1]最大为next[j]+1

这点应该都不难理解  因为最佳情况下next[j+1]最大的公共前后缀就是当next[j]的公共前后缀各往后移一位。所以例如next[5]=2,那么next[6]在最好的情况下等于3.

既然如此我们就不难理解为什么上来会先判断ch[i]==ch[j]。

那么else j=next又是为什么呢?

       首先我们先来看个图

假设有10个字母

如果我们现在要求next[10]那么我们一定是知道next[9]的值 假设此时next[9]=5 我们此时只需要判断ch[9]是否等于ch[5]在最好的情况下ch[9]等于ch[5]那么此时next[10]=6

如果不等的话 我们会让j=next[j]

这是为什么?

首先  我们知道图中所示的两个方框是相等的(因为next[9]=5)此时 我们若想找到next[10]的那么肯定要找到和ch[9]相等的字母,同时又想要公共前后缀尽可能的大,此时  我们通过next[9]=5可以知道 ch[8]=ch[4] 但是ch[10]的前缀肯定是从ch[1]开始的 ,想到这里我们不难发现ch[4]是ch[5]的后缀,那我们此时去找ch[5]的公众前后缀不就可以找到ch[9]的公共前后缀了嘛(此时找到的ch[9]的公共前后缀比上一次找到的ch[9]的公共前后缀小一点).假如ch[5]=3 那么说明ch[1]=ch[3] ch[2]=ch[4]那么 此时ch[1]=ch[7],ch[2]=ch[8](因为next[9]=4,所以ch[3]=ch[7],ch[4]=ch[8]) 那么我们判断一下ch[9]是否等于ch[3]就可以  如果等于 那么 next[10]=4否则 就重复上述操作.直到j=0时  让ch[10]=1,所以else的情况下,我们让j=next[j].

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值