数据结构 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虽然也是对于串的匹配,但是不是严格的匹配字符,而是匹配前缀后缀
此处有待完善。
阅读全文
0 0
- 数据结构 KMP next数组
- 数据结构之模式匹配KMP算法的next数组求解
- KMP 算法 next数组
- KMP next数组详解
- KMP中的next数组
- KMP 模板 next数组
- KMP算法--next数组
- KMP next[]数组
- KMP与next数组
- KMP next数组
- KMP的next数组
- kmp, next 数组
- KMP算法+NEXT数组
- KMP算法next数组
- POJ2406【KMP-next数组】
- kmp next 数组理解
- KMP之Next数组
- kmp 之 next数组
- Eclipse将web项目以war包形式导出
- 快速排序
- webService 实例1
- 多窗口模式编程介绍
- mybatis一、二级缓存详解
- 数据结构 KMP next数组
- linux把运行中的指令暂停或挂到后台运行
- 关于typedef的用法总结
- 如何将一个进程(线程)绑定到一个固定的CPU核上?——004
- 51Nod 1174:区间中最大的数
- 三角形兼梯形布局
- Oracle11g安装问题汇总
- 初学JAVA笔记(一)
- Quartz-JobDetail和Trigger-Job