| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 945 人关注过本帖
标题:帮帮忙 谢谢先
只看楼主 加入收藏
bcomer
Rank: 1
等 级:新手上路
帖 子:113
专家分:0
注 册:2004-9-13
收藏
 问题点数:0 回复次数:8 
帮帮忙 谢谢先

NEXT数组:

有点不明白

举个例子:

P="ABCAABABC"

i= 0 1 2 3 4 5 6 7 8

Pi= A B C A A B A B C

K 0 0 0 1 1 2 1 2

比较 != != = != = != = =

next[i] -1 0 0 -1 0 0 2 0 0

我认为next[0]=-1;

if(是=号) next[i]=next[k]-1;

else next[i]=next[k];

是吗?可NEXT[8]=0而不是1;

麻烦给讲讲可以吗?

2004-10-05 14:48
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 

不知道有人看懂了没有?


九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2004-10-05 14:54
bcomer
Rank: 1
等 级:新手上路
帖 子:113
专家分:0
注 册:2004-9-13
收藏
得分:0 
以下是引用knocker在2004-10-05 14:54:09的发言:

不知道有人看懂了没有?

我的意思是模式匹配,对字符串T=t1t2...tn;P=p1p2...pm;1<m<=n;

在T中查找和P相同的字符串的一种无回溯算法;

其中用到了NEXT数组,

想知到NEXT数组应该如何计算?

我看到的书中提到了以下的方法

先考虑K

K表示p0p1....pn中最大的前后缀长度

再比较pk和pi查看是否相等

最后得出NEXT数组

不知道说明白了没有

谁能给讲讲,我在计算时总是和实际(在1-2个数上)有所不同

[此贴子已经被作者于2004-10-05 15:10:34编辑过]

2004-10-05 15:08
bcomer
Rank: 1
等 级:新手上路
帖 子:113
专家分:0
注 册:2004-9-13
收藏
得分:0 

请喝茶!帮忙看看先

[em45]

2004-10-06 10:32
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
收藏
得分:0 
以下是引用bcomer在2004-10-05 15:08:41的发言:

我的意思是模式匹配,对字符串T=t1t2...tn;P=p1p2...pm;1<m<=n;

在T中查找和P相同的字符串的一种无回溯算法;

其中用到了NEXT数组,

想知到NEXT数组应该如何计算?

我看到的书中提到了以下的方法

先考虑K

K表示p0p1....pn中最大的前后缀长度

再比较pk和pi查看是否相等

最后得出NEXT数组

不知道说明白了没有

谁能给讲讲,我在计算时总是和实际(在1-2个数上)有所不同

有点晕!


2004-10-06 17:51
bcomer
Rank: 1
等 级:新手上路
帖 子:113
专家分:0
注 册:2004-9-13
收藏
得分:0 

我写的有那么混乱吗,

ai,我的意思是,我想看看NEXT数组的解释(NEXT数组是数据结构模式匹配部分的)

和计算方法,我觉得我明白的,但和答案有少许不同

帮忙给几个好的USL吧

谢谢先

2004-10-06 22:03
bcomer
Rank: 1
等 级:新手上路
帖 子:113
专家分:0
注 册:2004-9-13
收藏
得分:0 
2004-10-08 13:43
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
收藏
得分:0 

求NEXT数组的函数 来源(http://cn.math.pku.edu.cn/teachers/zhangnx/ds/Á¢Ìå¿Î¼þ/PS/ģʽƥÅä/¼ÆËãnextÊý×éµÄÔ´³ÌÐò.htm

void makeNext(PSeqString p, int *next)

/* 变量next是数组next的第一个元素next[0]的地址 */

{ int i=0,k=-1; /* 初始化 */

next[0]=-1; while (i<p->n-1) /* 计算next[i+1] */ { while (k>=0 && p->c[i]!=p->c[k]) { k=next[k]; /* 找出p0…pi中最大的相同的前后缀长度k */ }

i++; k++;

if (p->c[i]==p->c[k]) /* 填写next[i],同时考虑改善 */ next[i]=next[k];

else next[i]=k; }

}

计算next数组最简单的方法就是穷举法,算法的复杂度为O(m*m),整个算法的复杂度为O(m*m+n)。 不过还有复杂度为O(m)的算法,思想如下:假设P1P2...Pk = Pi-k+1...Pi,那么next[i] = k + 1 。当我们计算next[i+1]时,如果发现Pk+1 = Pi+1, 也就是P1P2...PkPk+1 = Pi-k+1...PiPi+1,那么next[i+1] = next[i] + 1 = k + 2。 但是如果Pk+1 <> Pi+1, 则比较next[k]和Pi+1(找下一个满足P1P2...Pk' = Pi-k'+1...Pi的k'),一直到匹配成功为止。

真是对不起,我还没看完数据结构,我也是现炒现卖的,真的对不起了

[此贴子已经被作者于2004-10-08 16:26:07编辑过]


淘宝杜琨
2004-10-08 16:25
bcomer
Rank: 1
等 级:新手上路
帖 子:113
专家分:0
注 册:2004-9-13
收藏
得分:0 
以下是引用神vLinux飘飘在2004-10-08 16:25:08的发言:

求NEXT数组的函数 来源(http://cn.math.pku.edu.cn/teachers/zhangnx/ds/%C1%A2%CC%E5%BF%CE%BC%FE/PS/%C4%A3%CA%BD%C6%A5%C5%E4/%BC%C6%CB%E3next%CA%FD%D7%E9%B5%C4%D4%B4%B3%CC%D0%F2.htm

void makeNext(PSeqString p, int *next)

/* 变量next是数组next的第一个元素next[0]的地址 */

{ int i=0,k=-1; /* 初始化 */

next[0]=-1; while (i<p->n-1) /* 计算next[i+1] */ { while (k>=0 && p->c[i]!=p->c[k]) { k=next[k]; /* 找出p0…pi中最大的相同的前后缀长度k */ }

i++; k++;

if (p->c[i]==p->c[k]) /* 填写next[i],同时考虑改善 */ next[i]=next[k];

else next[i]=k; }

}

计算next数组最简单的方法就是穷举法,算法的复杂度为O(m*m),整个算法的复杂度为O(m*m+n)。 不过还有复杂度为O(m)的算法,思想如下:假设P1P2...Pk = Pi-k+1...Pi,那么next[i] = k + 1 。当我们计算next[i+1]时,如果发现Pk+1 = Pi+1, 也就是P1P2...PkPk+1 = Pi-k+1...PiPi+1,那么next[i+1] = next[i] + 1 = k + 2。 但是如果Pk+1 <> Pi+1, 则比较next[k]和Pi+1(找下一个满足P1P2...Pk' = Pi-k'+1...Pi的k'),一直到匹配成功为止。

真是对不起,我还没看完数据结构,我也是现炒现卖的,真的对不起了

没关系,谢谢!

Thank you!神vLinux飘飘!

[此贴子已经被神vLinux飘飘于2004-10-08 17:16:42编辑过]

2004-10-08 17:05
快速回复:帮帮忙 谢谢先
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020484 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved