请教 关于KMP算法中的next数组的求法

小步舞曲 2011-09-02 12:12:48
void GetNext(SString S, int *next)
{
int i, j;
i = 1;
j = 0; //为什么初值是这样设置
next[1] = 0;

while (i<T[0])
{
if (j==0 || T[i]==T[j]) //什么时候j==0
{
++i;
++j;
next[i] = j;
}
else
j = next[j]; //这句更不明白了。。
}
}
KMP算法我懂了 next数组我自己在纸上也能求出来,可是就是这个函数不明白, 谁能帮我
...全文
290 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
keeya0416 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 keeya0416 的回复:]
引用 3 楼 zhuyi2654715 的回复:
昨天晚上迷迷糊糊就发了
现在我就这句不明白
j = next[j];
能帮我解释一下吗?


c a b c a b c d
! !
j i
这里T[i] != T[j]
说明这2个位置之前的字符是相同的,只是从这个开始不一样了
那么找到next[j]的位置,这个位置之前与 j 之前的是一样的,也就和 i 之前的……
[/Quote]
呀 排版有问题

c a b c a b c d
! !
j i

keeya0416 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zhuyi2654715 的回复:]
昨天晚上迷迷糊糊就发了
现在我就这句不明白
j = next[j];
能帮我解释一下吗?
[/Quote]

c a b c a b c d
! !
j i
这里T[i] != T[j]
说明这2个位置之前的字符是相同的,只是从这个开始不一样了
那么找到next[j]的位置,这个位置之前与 j 之前的是一样的,也就和 i 之前的也是一样的
这样就只用比较 next[j] 与 i 这2个位置的字符了
小步舞曲 2011-09-02
  • 打赏
  • 举报
回复
昨天晚上迷迷糊糊就发了
现在我就这句不明白
j = next[j];
能帮我解释一下吗?
小步舞曲 2011-09-02
  • 打赏
  • 举报
回复
谢谢各位的回答 我已经完全弄明白了 结贴了
nuptxxp 2011-09-02
  • 打赏
  • 举报
回复
j=next[j],就是当匹配失败时,j回朔到当前可能不会失败的的点,而i指针不回朔,再不断比较,
其实next函数就是一个子字符串匹配自己的过程
justlovetao 2011-09-02
  • 打赏
  • 举报
回复
LZ .你去看严蔚敏网上的KNP算法视频。我这几天看了三遍。。。。终于有点头绪了。她讲的实在太好了。想不懂都难。。。。你就百度搜索严蔚敏KMP算法。。你会懂了的
maoxing63570 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用楼主 zhuyi2654715 的回复:]
KMP算法我懂了 next数组我自己在纸上也能求出来,可是就是这个函数不明白, 谁能帮我
[/Quote]
貌似你还不懂KMP。
//什么时候j==0
第一次进while的时候j不就是0么。
不知道你是语言不行还是算法不行
AndyZhang 2011-09-02
  • 打赏
  • 举报
回复
next[j]就是如果不相同,那么下一个开始比较的位置在哪里?

这个你模拟几遍很容易看出来。

33,009

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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