KMP算法next数组的循环节问题
来源:互联网 发布:软件测试 培训学校 编辑:程序博客网 时间:2024/05/16 05:03
KMP算法在字符串的模式匹配中有比较广泛的用途,有时我们会遇到字符串中存在循环节的问题,那么就next数组中的循环节问题,我们来简单的说一下。
首先我们知道next数组的求法:
void init_next(){ int i=0,j=-1; next[0]=-1; while(i<len) { if(j==-1||T[i]==T[j]) { i++; j++; next[i]=j; } else j=next[j]; }}
讲解之前先说个结论:对于字符串的某一位置i ,如果有 i%(i-next[ i ])==0 , 则说明字符串开始循环了,并且循环到 i-1 结束,至于为什么这样呢:
我们先假设到达位置 i-1 的时候,字符串循环了(到i-1循环完毕),那么如果到第i个字符的时候,失配了,根据next数组的求法,我们是不是得回溯?然而回溯的话,由于字符串是循环的了(这个是假定的),next[i] 是不是指向上一个循环节的后面一个字符呢?答案是肯定的,而上一个循环节的末尾是 next[i]-1 ,然后现在循环节的末尾是 i-1 ,然么循环节的长度是多少呢?
所以,我们有 (i - 1) - ( next[i] - 1 ) = i - next[i] 就是循环节的长度(假设循环成立的条件下),但是我们怎么知道这个循环到底成立吗?
现在我们已经假设了 0到i-1 循环了,那么我们就一共有i 个字符了,如果有 i % ( i - next[i] ) == 0,总的字符数刚好是循环节的倍数,那么说明这个循环是成立的。
注意还有一点,如果 next[i] == 0,即使符合上述等式,这也不是循环的,举个反例
0 1 2 3 4 5
a b c a b d
-1 0 0 0 1 2
下标为1,2,3的next值均为0,那么 i%(i-next[i])=i%i==0,但是这个并不是循环。
解释完毕,然后再来看下,为什么求出来的循环节长度是最小的呢?
因为next数组失配的时候,总是回溯到最近的循环节,所以i-next[i]就是最小的循环节长度
为什么求出来的循环次数是最多的呢?
循环节长度是最小的了,那么循环次数肯定是最多的了。
总结一下,如果对于next数组中的 i, 符合 i % ( i - next[i] ) == 0 && next[i] != 0 , 则说明字符串循环,而且
循环节长度为: i - next[i]
循环次数为: i / ( i - next[i] )
- KMP算法next数组的循环节问题
- KMP算法-next数组的应用-循环节问题
- 【kmp算法next数组-串的最小循环节/循环周期】Period HDU
- KMP算法的next数组
- KMP算法 —— next 数组的应用 --- 前缀中最小循环节,最大重复次数
- KMP算法 —— next 数组的应用 --- 前缀中最小循环节,最大重复次数
- POJ2406 Power Strings KMP-next数组的循环节
- hdu1358 kmp的next数组求循环节
- KMP next数组求最小循环节
- KMP 算法 next数组
- KMP算法--next数组
- KMP算法+NEXT数组
- KMP算法next数组
- KMP算法中的NEXT数组的应用
- 关于KMP算法的NEXT数组解释
- KMP算法的next[]数组通俗解释
- KMP算法next数组的理解
- hdu3336解读KMP算法的next数组
- Android再曝重大漏洞!请及时更新你的系统
- iOS 7.0 设置长文本UILabel高度
- 教育数据挖掘
- java笔记
- QTP资源
- KMP算法next数组的循环节问题
- C++优雅的值交换
- Java多线程银行取款
- DLL与LIB库文件的生成和使用---C++
- HTML5 文件上传
- Ngui 五种点击事件实现方式及在3d场景中点击穿透的情况
- Android AlertDialog对话框的使用及实例(显示提示消息的对话框)
- 一维搜索技术
- 配置lenovo E430 + Ubuntu 13.04无线网卡