KMP算法中next和nextval数组的计算方法

本文介绍了KMP算法中next和nextval数组的计算方法,以字符串S='aabaabaabaac'和P='aabaac'为例,展示了S和P的next和nextval值。在匹配过程中,使用BF算法和KMP算法,并指出KMP(nextval)的匹配过程与next相同,因为没有涉及不同失败值的情况。

设字符串S=aabaabaabaac    P=aabaac

1.      给出SPnext值和nextvai;

2.      S作主串,P为模式串,试给出利用BF算法和KMP算法的匹配过程.

答:
1. 给出 S P next 值和 nextvai ;

失效函数采用的是清华殷人昆的数据结构上的函数。(有的人和他有点区别,本质一样)

f(j)=k,0<=k<j,且使得p0p1p2…pk = p(j-k)p(j-k+1)…pj;f(j)=-1,其他情况。

S=”aabaabaabaac”next值为”-1,0,-1,0,1,2,3,4,5,6,7,-1”

T=”aabaac”next值为”-1,0,-1,0,1,-1”

Nextval值是对next值的一种修正,因为在pi的字符和p(f(i-1)+1)的字符相同,导致从在模式T的指针从ip(f(i-1)+1)也是一种浪费,所以在pip(f(i-1)+1)位置相同的地方,将p(i-1)f(i-1)值换成f(f(i-1)),从低位向高位计算替换。.

Snextval值为”-1,0,-1,-1,0,-1,-1,0,-1,-1,7,-1”

Tnextval值为”-1,0,-1,-1,1,-1”

2.      S作主串,P为模式串,试给出利用BF算法和KMP算法的匹配过程.

BF

 

a

a

b

a

a

b

a

a

b

a

a

c

1

a

a

b

a

a

c

 

 

 

 

 

 

2

 

### 定义 Next数组KMP(Knuth-Morris-Pratt)算法中的一个关键数据结构。它主要记录了模式串中每个位置之前的子串的最长公共前后缀的长度信息。例如,对于一个模式串,其每个位置对应的Next数组值反映了该位置之前的子串的前缀后缀相同部分的最大长度。不过在不同实现中,Next数组的赋值有所差异,有的是将`next[0]`赋值为 -1,`next[1]`为 0;有的是直接从`next[0]`为 0 开始,这主要是模式串对应的公共前后缀整体前移了一位的区别 [^1]。 ### 作用 Next数组KMP算法中起着核心作用,它能够避免在字符串匹配过程中进行不必要的回溯。当在主串模式串匹配过程中出现不匹配的情况时,利用Next数组可以快速将模式串移动到合适的位置继续进行匹配,从而提高匹配效率。 ### 实现方法 下面以`next[0]`赋值为 -1 的实现方式为例,给出Java代码示例: ```java public class KMPNextArray { public static int[] getNext(char[] cn) { int lenn = cn.length; int[] next = new int[lenn]; // 修改长度与匹配项长度一致 next[0] = -1; int j = -1; // 前缀 int i = 0; // 后缀 while (i < lenn - 1) { // 因为0已经赋值,所以少了一位,所以lenn-1 if (j == -1 || cn[i] == cn[j]) { i++; j++; next[i] = j; } else { j = next[j]; } } return next; } public static void main(String[] args) { String pattern = "ABCDABD"; char[] cn = pattern.toCharArray(); int[] next = getNext(cn); for (int value : next) { System.out.print(value + " "); } } } ``` 在上述代码中,通过一个`while`循环来构建Next数组。在循环中,使用两个指针`i``j`分别表示后缀前缀的位置。当`cn[i]``cn[j]`相等或者`j`为 -1 时,`i``j`同时后移,并将`j`的值赋给`next[i]`;当不相等时,`j`回溯到`next[j]`的位置继续比较。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值