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];
}
}
其中第三部分,个人觉得这只是自己笔算的求法,因为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];
}
}
相关文章推荐
- Java程序员的C#学习笔记(关于.NET的理解)
- cocos2d-x系列笔记(9.1)---浅谈cocos2d-x使用函数指针实现委托(上)---通过c#代码理解委托
- 没头没尾--项目开发笔记 C#企业级模板理解
- 【KK学习笔记】c# 虚方法 virtual 、 重写方法 override 、new 的使用与理解
- C#学习笔记---函数 的理解及总结(入门级)
- C#学习笔记二:用实例深入理解装箱、拆箱
- [C#学习笔记02]理解值和引用
- 关于KMP算法中前缀函数(next函数)的一点个人理解
- C#学习笔记一 设计思想的理解
- 深入理解C#第二版笔记
- KMP算法的简单理解 【笔记】
- c#学习笔记之十 socket编程的listen()方法参数的理解,即backlog
- 深入理解C#学习笔记之走出误区
- 早些学C#时对委托和事件的理解笔记
- 数据结构笔记--通过与BF算法的比较理解KMP算法
- 黑马程序员之c#学习笔记:如何理解C#中的指针
- C#学习笔记一——对.netFramework的理解
- C# 2010 从入门到精通 学习笔记7 第8章 理解值和引用
- C# 2010 从入门到精通 学习笔记7 第8章 理解值和引用
- KMP算法中next函数的理解