数据结构 KMP next数组

来源:互联网 发布:4k电视直播软件 编辑:程序博客网 时间:2024/06/08 10:27

数据结构 KMP next数组

2017年9月29日13:23:43
本人大三,专业地信,正在学习数据结构。主要用C语言写。
以博文记录自己的收获。

参考文献:

http://m.blog.csdn.net/yutianzuijin/article/details/11954939——未经对方博主同意——next理解
http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html——未经对方博主同意——前缀后缀的理解
http://blog.csdn.net/v_july_v/article/details/7041827——KMP算法
https://www.zhihu.com/question/21474082——知乎导航

next[pos]一方面是关于pos之前的子字符串里面的各种子字符串相同的前缀和后缀的最大长度,一方面是下一次跳转的next位置。

next可以进行类似于递推的东西。next[next[pos]]。每一次next操作都相当于分割了pos指针的子字符串。

if pos与next[pos]处的字符相同,所以next[pos+1]=next[pos]+1;
if pos与next[next[pos]]的字符串相同,next[pos]=next[next[pos]]+1;直到分割长度为0位置;

具体算法实现;

//pattern串的第一个存储的是字符串的长度。int i=1;int j=0;next[0]=0;    while(i<T[0]){    if(j==0 || T[I]==T[j])          ++j;++i;        next[i]==j; 如果成功就直接赋值    else        j=next[j];    }
//似乎是一个不完美的next,也就是虽然利用了匹配信息但是没有充分利用。//会出现 aaaab 01234 的情况,也就是next会一个一个进行跳转。但是有更快的方法。也就是实现aaaab 00004的情况。
//一个更好的next防止出现 j重复匹配的问题:while (i<T[0]){    if (j==0 || T[i]==T[j]) {        ++i;++j;        if (T[i]!=T[j]) {            next[i]=j; //其实是失配,            }        else {            next[i]=next[j];  //配对成功 ,直接赋值。            }    else         {  j = next[j]  }        //失配,但是由于j没有到第一个还有希望。继续进行遍历。    }}

//我个人对于next的理解还不够深入,next虽然也是对于串的匹配,但是不是严格的匹配字符,而是匹配前缀后缀
此处有待完善。

原创粉丝点击