您的位置:首页 > 编程语言 > C#

KMP算法Next函数理解笔记(C#)

2012-04-08 14:33 274 查看
KMP算法详解请参考任我行博客http://www.cppblog.com/oosky/archive/2006/07/06/9486.html

其中第三部分,个人觉得这只是自己笔算的求法,因为K的初始值貌似永远都是-1,每次都是蛮力求解,与代码的写法不一致。看了代码半天,调试了很久,想了很久,有了点自己的理解,做一下记录,免得以后忘记了。

####################################################

. 怎么求串的模式值next


定义

(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)的其他情况。

#####################################################

// 求模式串T的next函数值并存入数组 next。

int j = 0, k = -1;

next[0] = -1;

for (j = 0; j < this.T.Length - 1; )

{

if (k == -1 || T[j] == T[k])

{

++j; ++k;

// 这个If Else主要用来求出Next函数值,分为两种情况

// 这是上面的第三种情况,补充说明:进入下一轮循环后,T[j] == T[k]必定不成立,而且下面一个else的情况保证了K值回溯必须是在T[j] != T[k]

if (this.T[j] != this.T[k]) next[j] = k;

// 这应该上面说的第二种情况,但是上面的说法直接说等于-1,没有解释递推的想法,所以很难理解,这里的意思是如果T[j] == T[k],则j的情况应该是k的情况一样的,这个case也是KMP算法的基础,就是说这么一个想法,不但应用在KMP算法中,也应用于Next函数求解中。

// 该处有动态规划的思想,即Next[K]是最优解,则Next[j]也是最优解---百度有KMP算法的优化一说,这里已经做了优化

else next[j] = next[k];

}

// 目的是为了找到K==-1|| T[j] == T[k]

else

{

// 当T[j] != T[k]时,回溯K值。

// 也可以写在next[j] = k 之后(但是必须递归至k == -1 || T[j] == T[k])。

k = next[k];

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: