关闭

KMP算法——字符串匹配

121人阅读 评论(0) 收藏 举报
分类:

自己的笔记:

nextval[]规则:

= -1 ① j = 0 目标子串的首位;② T[j] = T[0] 且j之前没有与开头相同的字符;③  T[j] = T[0] 且j之前有与开头相同的字符,但j位本身也在相同子串之内。

= k j之前k位与开头k位相同,但j位本身也在相同子串之内。

= 0 其余情况 (注:j位本身也在相同子串之内,且不跟首位相同,值为0)


若比较到j位出现不等时,next[j] = -1 则 j = 0, i =+ 1; next[j] != -1 则 j = next[j], i不变。



----------------------------------------------------------------

java实现和改进:http://blog.sina.com.cn/s/blog_85b0ae450101j2iy.html



http://blog.csdn.net/pony_maggie/article/details/37832707






http://blog.csdn.net/lin_bei/article/details/1252686

定义
1next[0]= -1 意义:任何串的第一个字符的模式值规定为-1
2next[j]= -1   意义:模式串T中下标为j的字符,如果与首字符
相同,且j的前面的1—k个字符与开头的1—k
个字符不等(或者相等但T[k]==T[j])(1k<j)。
如:T=”abCabCad”  next[6]=-1,因T[3]=T[6]
3next[j]=k    意义:模式串T中下标为j的字符,如果j的前面k
字符与开头的k个字符相等,且T[j] != T[k] 1k<j)。
                       T[0]T[1]T[2]。。。T[k-1]==
T[j-k]T[j-k+1]T[j-k+2]…T[j-1]
T[j] != T[k].1k<j;
(4) next[j]=0   意义:除(1)(2)(3)的其他情况。
 
举例
01T=abcac”的模式函数的值。
     next[0]= -1 根据(1
     next[1]=0   根据 (4)   因(3)有1<=k<j;不能说,j=1,T[j-1]==T[0]
     next[2]=0   根据 (4)   因(3)有1<=k<j;T[0]=a!=T[1]=b
     next[3]= -1 根据 (2)
     next[4]=1   根据 (3) T[0]=T[3]  T[1]=T[4]
       
下标
0
1
2
3
4
T
a
b
c
a
c
next
-1
0
0
-1
1
T=abcab”将是这样:
下标
0
1
2
3
4
T
a
b
c
a
b
next
-1
0
0
-1
0
为什么T[0]==T[3],还会有next[4]=0因为T[1]==T[4], 根据 (3)” T[j] != T[k]”被划入(4)。
02)来个复杂点的,求T=”ababcaabc” 的模式函数的值。
next[0]= -1    根据(1
         next[1]=0    根据(4)
         next[2]=-1   根据 (2)
next[3]=0   根据 (3) T[0]=T[2] T[1]=T[3] 被划入(4
next[4]=2   根据 (3) T[0]T[1]=T[2]T[3] T[2] !=T[4]
next[5]=-1 根据 (2) 
next[6]=1   根据 (3) T[0]=T[5] T[1]!=T[6]
next[7]=0   根据 (3) T[0]=T[6] T[1]=T[7] 被划入(4
next[8]=2   根据 (3) T[0]T[1]=T[6]T[7] T[2] !=T[8]
 
下标
0
1
2
3
4
5
6
7
8
T
a
b
a
b
c
a
a
b
c
next
-1
0
-1
0
2
-1
1
0
2
只要理解了next[3]=0,而不是=1next[6]=1,而不是= -1next[8]=2,而不是= 0,其他的好象都容易理解。
03)   来个特殊的,求 T=”abCabCad” 的模式函数的值。
下标
0
1
2
3
4
5
6
7
T
a
b
C
a
b
C
a
d
next
-1
0
0
-1
0
0
-1
4
         
next[5]= 0 根据 (3) T[0]T[1]=T[3]T[4],T[2]==T[5]
next[6]= -1 根据 (2) 虽前面有abC=abC,T[3]==T[6]
next[7]=4   根据 (3) 前面有abCa=abCa, T[4]!=T[7]
T[4]==T[7],即T=” adCadCad”,那么将是这样:next[7]=0, 而不是= 4,因为T[4]==T[7].
下标
0
1
2
3
4
5
6
7
T
a
d
C
a
d
C
a
d
next
-1
0
0
-1
0
0
-1
0
 
如果你觉得有点懂了,那么
练习:求T=”AAAAAAAAAAB” 的模式函数值,并用后面的求模式函数值函数验证。
意义
 next 函数值究竟是什么含义,前面说过一些,这里总结。
设在字符串S中查找模式串T,若S[m]!=T[n],那么,取T[n]的模式函数值next[n],
1.       next[n]= -1 表示S[m]T[0]间接比较过了,不相等,下一次比较 S[m+1] T[0]
2.       next[n]=0 表示比较过程中产生了不相等,下一次比较 S[m] T[0]
3.       next[n]= k >0 k<n, 表示,S[m]的前k个字符与T中的开始k个字符已经间接比较相等了,下一次比较S[m]T[k]相等吗?
4.       其他值,不可能。

0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:92734次
    • 积分:148
    • 等级:
    • 排名:千里之外
    • 原创:65篇
    • 转载:64篇
    • 译文:0篇
    • 评论:8条
    文章分类
    最新评论