KMP算法中next数组和nextval数组值的推导
来源:互联网 发布:卫星影像下载软件 编辑:程序博客网 时间:2024/05/22 01:29
提到子串的模式匹配算法就不得不提到大名鼎鼎的KMP算法,而KMP算法的实现离不开next数组或nextval数组,今天我们就来说一下有关next数组和nextval数组求值的问题。
我们先来看下next数组
首先我们列出next的函数定义:
0,当j=1时
next[j]= Max{k|1<k<j,且’p1…pk-1’=’pj-k+1…pj-1’}当此集合不为空时
1 其他情况
对于这个函数什么意思我们通过具体的例子来理解
T=”ababcb”
j 123456
模式串T ababcb
next[j] 011231
1) 当j=1时 next[1]=0;
2) 当j=2时 由1到j-1只有一个字符“a”,属于其他情况next[2]=1;
3) 当j=3时 1到j-1是串“ab”,显然“a”与“b”不相等,属其他情况,next[3]=1;
4) 当j=4时 1到j-1是串“aba”,此时前缀字符“a”与后缀字符“a”相等,由此可推算k值等于2(由’p1…pk-1’=’pj-k+1…pj-1’,得到p1=p3),next[4]=2;
5) 当j=5时 1到j-1是串“abab”,此时前缀字符“ab”与后缀字符“ab”相等,k值为前缀字符与后缀字符相等的个数加1,next[5]=3;
6) 当j=6时 1到j-1是串“ababc”,由于前缀字符“a”与后缀字符“c”并不相等,所以属于其他情况,next[6]=1;
我们根据经验可以得到如果前后缀一个字符相等,next[j]值是2,2个字符相等next[j]值是3,n个字符相等next[j]值就是n+1。
还有一种情况要特别注意一下如串“ababac”,当j=6时,由于“aba”与“aba”相等,重叠了一个“a”,此时next[6]=4;
讲完next数组之后,我们再来讲一下nextval数组,我们看下面的例子:
T=”ababaaaba”
j 123456
模式串T ababaa
next[j] 011234
nextval[j] 010104
先算出next数组的值分别为011234,然后再分别判断
1) 当j=1时,nextval[1]=0,这没什么好说的
2) 当j=2时,因为第二位字符“b”的next值为1,所以我们去与第一位字符“a”比较,它们不相等,则nextval[2]=next[2]=1;
3) 当j=3时,第三位字符“a”与第next[3]位(即第一位)字符 “a”相等,所以nextval[3]=nextval[1]=0;
4) 当j=4时,第四位字符“b”与第next[4]位(即第二位)字符 “b”相等,所以nextval[4]=nextval[2]=1;
5) 当j=5时,第五位字符“a”与第next[5]位(即第三位)字符 “a”相等,所以此时nextval[5]=nextval[3]=0;
6) 当j=6时,第六位字符“a”与第next[6]位(即第四位)字符“b”不相等,此时nextval[6]=next[6]=4;
根据以上例子相信你们也能发现规律如下:
nextval[1]永远等于0,之后的第j位字符先去与第next[j]位字符比较,如果相等nextval[j]=nextval[n](n=next[j]),若不相等则nextval[j]=next[j]
以上就是博主关于next数组和nextval数组求值的一些看法,有什么问题欢迎指正。
以上内容参考自《大话数据结构》
- KMP算法中next数组和nextval数组值的推导
- KMP算法中next和nextval数组的计算方法
- KMP算法中next和nextval数组的求解
- KMP算法中next数组、nextval数组的手工计算
- KMP模式匹配算法中next和nextval数组的快速求解
- KMP算法求next数组和nextval数组
- 手动计算KMP算法的Next数组与NextVal数组
- KMP算法求next数组和nextval…
- 应付考试用的KMP算法中next数组及nextval数组的计算(笑)
- KMP算法中Next数组及改进后的nextval数组的求法
- KMP算法求next数组和nextval数组的简单方法
- KMP算法求next数组和nextval数组的简单方法
- KMP算法求next数组和nextval数组的简单方法
- KMP算法求next数组和nextval数组的简单方法
- KMP算法中nextval数组的计算方法
- KMP算法中改进的nextval数组
- 计算KMP模式匹配算法中next数组的代码分析及改进型KMP算法中nextval数组代码分析
- KMP算法next数组推导
- 如何 在Spring MVC中 使用多个Spring和MyBatis的xml配置文件(多模块配置)
- 仟滋佰味商城
- MySQL概述
- 在ubuntu V16.04 中 编译树莓派2 linu内核
- 用开源软件将shp文件导入MySQL,并通过geoserver发布地图服务
- KMP算法中next数组和nextval数组值的推导
- Unity_通讯案例_Udp
- 跨域解决方案大全
- unity质量设置
- 【Oracle】基本操作(一)
- 15_集合框架
- Anroid camera + mediacodec
- 进程学习:进程间通信(system v IPC)3.信号灯
- android压力测试命令monkey