自己的笔记:
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
定义
:
(
1
)
next[0]= -1
意义:任何串的第一个字符的模式值规定为
-1
。
(
2
)
next[j]= -1
意义:模式串
T
中下标为
j
的字符,如果与首字符
相同,且
j
的前面的
1—k
个字符与开头的
1—k
个字符不等(或者相等但
T[k]==T[j]
)(
1
≤
k<j
)。
如:
T=”abCabCad”
则
next[6]=-1
,因
T[3]=T[6]
(
3
)
next[j]=k
意义:模式串
T
中下标为
j
的字符,如果
j
的前面
k
个
字符与开头的
k
个字符相等,且
T[j] != T[k]
(
1
≤
k<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].
(
1
≤
k<j
)
;
(4) next[j]=0
意义:除(
1
)(
2
)(
3
)的其他情况。
举例
:
01
)
求
T=
“
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
,而不是
=1
,
next[6]=1
,而不是
= -1
,
next[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.
其他值,不可能。