KMP算法中,如何手动求next数组和nextval数组?
首先我们要理解next数组的意义,为了实现更加高效的字符匹配,next数组是用来寻找字符串数组内部的自身的一种规律,利用字符串内部的一种相似性,来优化字符串数组匹配算法。所以才需要计算这么一个next数组来帮助算法更好的实现字符串匹配。
next数组的计算方式逻辑上稍微复杂,初学者可能很难看懂,所以首先要理解,为什么要计算next数组以及更加优化的nextval数组。
假如有这样一串字符串
1 2 3 4 5 6
a a a a a a
这可以说是一个字符串间规律最强的一个数组了吧,让我们来手动模拟一下。
首先默认第一位是0,第二位是1,从第3位开始求,比较第3-1位和next[3-1]的字符是否相同,若相同,则next[3]=next[2]+1
所以第3位的值就是2.那么依此类推就可以得到,这个字符串的next数组为
1 2 3 4 5 6
a a a a a a
0 1 2 3 4 5
总结来看就是相同就在他的next数组值加1.
那么有这样一个字符串那
1 2 3 4 5 6
a b c d e f
默认给出第1位为0 第二位为1 ,发现全都不一样,可以说毫无相关性了,所以next数组为
1 2 3 4 5 6
a b c d e f
0 1 1 1 1 1
这两种极端情况可以让大家初步了解一下计算next数组的方法,起码可以初步理解一下next数组的意义。但是这还不完善。
下面介绍一到北邮2016年考研真题
1 2 3 4 5 6 7 8
a b a a