kmp算法对应next数组中核心while部分的剖析

来源:互联网 发布:linux翻译软件 编辑:程序博客网 时间:2024/06/01 09:03

在写此文之前,我看了很多关于kmp算法的资料,此文主要是针对对应kmp算法已经稍微知道,但是却看不懂求解next数组部分的while部分。

while部分是整个求解next数组的核心。相信看过kmp算法资料的人都知道,所谓的next数组,是待匹配的字符串的最大相同前后缀。

例如 主字符串“adhajdnjkabefaehdfbieadbkaeudio”  待匹配的字符串“adb”,就是从主串中去寻找是否存在待匹配的字符串。

对于一般情况,求解字符串的next数组,很容易理解,关键在于

while (index >= 0 && pattern[i] != pattern[index + 1])//pattern是待匹配的数组 ,index是对应位置的最大相同前后缀。

{
index = next[index];
}

我相信肯定有部分人对这个while里面的内容百思不得其解。

这里 我的next数组的初始值为0,有些资料上是-1.

如果字符串的某位的next值不为0(假设为n),说明此位(假设为y)与前面的第n位相同,并且从y-n到y,和从0到n都分别对应相同。

但是到了第y+1位时,忽然和第n+1位不一样了,问题就来了,我一开始以为,既然不一样了,那么y+1位的next值就是0咯。

其实不一定,因为在前n位仍然存在小于n位的字符串可能与第y+1位以及y+1位前几位正好对应匹配。

那我们假设,存在这种情况,如下图

倒数第二位的c和第7位的c相同。next值为7.可是倒数第1位的t和第8位的a不匹配。但是我们发现,它和第4位的t相同。并且,前面三位也正好匹配。

这确实是一种巧合,但是我们不能忽略这种巧合,关键在于怎么求。

我们知道,倒数第二位的c和第7位的c相同,那么如果第7位的c也有匹配值(不为0),例如图上就是第三位的c,也就是说,倒数第二位的c和第三位的c一样。

这个时候我们再判断第三位和倒数第二位分别延后一位的字符是否一样。图上是一样的,所以最后一位t匹配值为4.

当然,如果不一样,我们就继续while循环,第三位的c是否有匹配值(也就是倒数第二位的c是否还有更小的匹配值),如果有,那么重复上述。

也就是while的作用。直到前面都没了匹配值,也就是为0了。

0 0
原创粉丝点击