导航
  • 全部
  • 博文收录
  • Ada助手
  • 问答

算法情景分析 Kmp 的next数组

titer1 2012-08-17 08:10:34
刚刚看到有网友在问Kmp next数组,
心宗有若干想法,就在这儿写下来吧,

任何算法有了实现,才有生命,code就是生命的载体啊。
但是优秀的算法,code总是那么精炼。
kmp也是,不能不贴上代码。
来一段吧:


void SetPrefix(const char *Pattern, int prefix[])

{
int len=CharLen(Pattern);//模式字符串长度。
prefix[0]=0;
for(int i=1; i<len; i++)
{
int k=prefix[i-1];
//不断递归判断是否存在子对称,k=0说明不再有子对称,Pattern[i] != Pattern[k]说明虽然对称,但是对称后面的值和当前的字符值不相等,所以继续递推
while( Pattern[i] != Pattern[k] && k!=0 )
k=prefix[k-1];

if( Pattern[i] == Pattern[k])//找到了这个子对称,或者是直接继承了前面的对称性,这两种都在前面的基础上++
prefix[i]=k+1;

else
prefix[i]=0; //如果遍历了所有子对称都无效,说明这个新字符不具有对称性,清0
}

copyright @yearn520



首先说作用吧:
kmp的next数组是用来表征自我 覆盖程度,值越小,覆盖程度越低。

那么如何表示自我覆盖程度

3个列子:
前提:next元素初始值为-1
再给前面的代码给个标示:
while( Pattern[i] != Pattern[k] && k!=0 ) k=prefix[k-1]; //情形1
//特别注明:如果next数组(即prefix数组)初始值为-1,这里纠正0为-1

if( Pattern[i] == Pattern[k]) prefix[i]=k+1; //情形2
prefix[i]=0; //情形3,特别注明:如果next数组(即prefix数组)初始值为-1,这里纠正0为-1


case 1: aaaa
aaaa对应的next数组:next[]={-1,0,1,2};
计算过程对应代码路径:一直只执行 情形2 ,lucky!!

case 2: abcd
aaaa对应的next数组:next[]={-1 -1 -1 -1};
计算过程对应代码路径:一直只执行 情形3 ,bad luck!

case 3: ababab
aaaa对应的next数组:next[]={-1 -1 0 1 2 3};
计算过程对应代码路径:先后执行 情形 3,情形3,然后 情形一直情形2

为什么要kmp

这是一个学习kmp算法反复要问自己的话题,
当前我认为就是用空间换时间,用next提供的信息来告诉匹配过程少走弯路。


下一次有时间结合使用Next数组的程序讲解。

初次学习,不免疏漏,请大家指教。
...全文
给本帖投票
193 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
titer1 2012-08-29
  • 打赏
  • 举报
回复
就当这个帖子是 我学习Kmp的一个记录吧了。

每次看kmp都有 新的想法。
估计 还是不精通。。

一个用空间换时间的算法这么经典。

这里我就思考在这儿
我总想 试着 有些问题可以大道至简的解答

有兴趣的铜须,可以看看这里
http://blog.csdn.net/oyd/article/details/3110435
titer1 2012-08-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

这么喜欢转载?

非技术区倒是情有可原。

CSDN博客放着你不用,
[/Quote]

其实,不是不用博客,
也开着博客,但是 感觉自己的想法不是很成熟,还有放在博客里,自己看着,是对是错也不知道

就放在坛子里,让大家锤炼锤炼啊。

谢谢你的建议
xitijie 2012-08-17
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
刚刚看到有网友在问Kmp next数组,
心宗有若干想法,就在这儿写下来吧,

任何算法有了实现,才有生命,code就是生命的载体啊。
但是优秀的算法,code总是那么精炼。
kmp也是,不能不贴上代码。
来一段吧:

C/C++ code

void SetPrefix(const char *Pattern, int prefix[])

{
int len=Cha……
[/Quote]

我还是不懂,这个next数组里面的值表示的意义,还有为什么第一个有的定义为0,有的是-1.....有没有详细点的解释?
小小水滴 2012-08-17
  • 打赏
  • 举报
回复
是啊,放在博客不是可以让更多的人看到吗
RLib 2012-08-17
  • 打赏
  • 举报
回复
这么喜欢转载?

非技术区倒是情有可原。

CSDN博客放着你不用,
xitijie 2012-08-17
  • 打赏
  • 举报
回复
顶.........就是我提问的

65,171

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧