社区
软件水平考试
帖子详情
请高手详细讲讲KMP算法(谢谢先)
free12345
2004-11-03 08:27:27
偶看此算法时觉的书上讲的很乱,而且有的地方有些问题,请高手帮忙讲一下。
...全文
384
20
打赏
收藏
请高手详细讲讲KMP算法(谢谢先)
偶看此算法时觉的书上讲的很乱,而且有的地方有些问题,请高手帮忙讲一下。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
20 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
fanyuanmail
2004-11-07
打赏
举报
回复
huich的方法很对,
也讲的很清楚,其实很简单的。
不过有时让算NEXTVAL的数组
huich
2004-11-05
打赏
举报
回复
看它前面是否有一个最长的 "字符串"和从第一个字符开始的 "字符串" 相等, 若一个都没有就为1;如果有,你就把它找出来,看它有多长;next就是其长度加1
比如 模式是 "abaabcac" 的 next[j];
1.a 一定是 0 //第一个
2.b 一定是 1
3.为a,前一个为b,b != a(a为第一个字符),所以next[a] = 1;
4.为a,前一个为a,a == a,相等就再看ab != ba,所以next[a] = 2;(1+1)
5.为b,同上理有a==a,相等就再看ab != aa,所以next[b] = 2;(1+1)
6.为c,前一个为c, b!=a,ab==ab,所以next[c] = 3;(2+1)
7.为a,都没有相等的,所以next[a] = 1;
8.为c,a==a,所以next[c] = 2
next[j]=01122312
minanqiang
2004-11-05
打赏
举报
回复
UP
hackingtruth
2004-11-04
打赏
举报
回复
做个标记先
metaphor
2004-11-04
打赏
举报
回复
就是求一个字符串的前缀在右面什么地方又出现了一次
比如abbbbab,我比到最后一个b失败了,我就可以把字符串推进5格再比,
而简单的比法是一次推进1格
wegotnothingtolosebu
2004-11-04
打赏
举报
回复
假设文本串“t1,t2,…tn”, 模式串为“p1,p2,…pn”,当文本串中的第I个字符与模式中第j个字符不匹配时,文本串的第i个字符再与模式串中的第k个字符进行比较,则模式中前k-1个字符的子串必须满足下面的关系式:’p1,p2…pk-1’=’pj-k+1,pj-k+2…pj-1
若令next[j]=k, 则next[j]表明当模式中第j个字符与文本串中相应字符不匹配时,在模式中需要从新和文本串中该字符进行比较的字符的位置。
next[j]=0,当j=1时
next[j]=max,{k|1<k<j,且’p1p2…pk-1’=’pj-k+1,pj-k+2…pj-1’}
next[j]=1,其他情况
此时,kmp算法如下:
1)假设以指针i和j 分别指示文本串和模式串中的比较字符,令i和j的初值为1,开始匹配
2)若在匹配过程中ti=pj, 则i和j分别增1
3)若不相等,匹配失败后,则I不变,j退到next[j]位置在进行比较
4)若相等,则指针各增1,否则j再退到下一个next值的位置
5)依此类推,直至下列两种情况:一种是j退到某个next值时字符比较相等,则i和j分别增1,继续进行匹配;另一种是j退到值为0(即模式的第一个字符失配),则i和j也分别增1,表明从文本串的狭义个字符起和模式串重新开始匹配。
shiyi0927
2004-11-04
打赏
举报
回复
还是不明白啊!
free12345
2004-11-04
打赏
举报
回复
高手呢?
loveweiwei
2004-11-04
打赏
举报
回复
给个详细的例子吧。。把过程也讲一下。。谢谢!
gll30
2004-11-04
打赏
举报
回复
搜索一下把,关键字“next”,已经有人讨论过了,方法狂好
free12345
2004-11-04
打赏
举报
回复
举例说一下吧,
比如 模式是 "abaabcac" 的 next[j]
奇型怪状
2004-11-04
打赏
举报
回复
顶一下先
wegotnothingtolosebu
2004-11-04
打赏
举报
回复
这个要说明白还真不容易。我当初也想了大半天不明白。试这样想想,如果你要自己设计这个算法,你要怎么样做?
如果是考高程的话,估计不会考这个。倒是考研常考这个。4
free12345
2004-11-04
打赏
举报
回复
真的没有人给讲一下么,急啊
feetu
2004-11-04
打赏
举报
回复
淹死好几次了
zhouqi66
2004-11-04
打赏
举报
回复
next[]是根据字符串格式判断需要回退几个步的一组数据,求解方法教程上有吧?
free12345
2004-11-04
打赏
举报
回复
fanyuanmail(yuanyuan)
能将一下next[j]的求解方法么?
free12345
2004-11-04
打赏
举报
回复
谢谢,wegotnothingtolosebu(再教育,把穷人通通打昏!!) ,
谁能再详细的讲一下 next[]数组呢?
fanyuanmail
2004-11-04
打赏
举报
回复
其实KMP的题大部分都是靠NEXT和NEXTVAL
会手工求这两个,大部分考试都能应付
wegotnothingtolosebu
2004-11-03
打赏
举报
回复
相较于传统的简单比较算法,KMP算法的长处在于在比较过程中没有对目标字符串的回溯。
算法思想描述如下:
设目标字符串为S,模式字符串为P
若Si Si+1 … Si+j == P0 P1 … Pj 且 Si+j+1 !=Pj+1
如果我们知道 P0 P1 … Pk == Pj-k Pj-k+1 … Pj,那么就可以从Si+j+1和Pk+1继续开始比较过程,从而避免对S的回溯。
由于P是已知的,所以在这个算法一开始,首先建立一个j到k的映射f.
下面考虑算法的时间复杂度。设S的长度为n,P的长度为m
显然,对S的计算过程时间复杂度为O(n).
在计算映射f时,如果简单比较,时间复杂度是O(m^2).采用一些小技巧,可以将它降到O(m):
如果已知f(j)==k,那么若Pk+1==Pj+1,则f(j+1)=k+1,否则比较Pf(k)+1和Pj+1.如此反复一直到找到匹配。
ACM超级经典算法大集合
ACM超级经典算法大集合。大家都知道acm大赛对计算机专业的大学生说是很有用的
c语言常用算法集
几个不错的c语言算法
十三个经典算法研究PDF文档[带目录+标签]
本文件是十三个经典算法研究+红黑树系列的,带目录+标签的PDF文档。在此之前,网上绝无仅有。希望,对你有帮助。博客地址为:http://blog.csdn.net/v_JULY_v。
java数百种算法实现
java数百种算法实现
java算法大全(含源码包)
java算法大全,有近100多种常见算法的源代码,是学习JAVA算法的难得资料。
软件水平考试
2,958
社区成员
22,570
社区内容
发帖
与我相关
我的任务
软件水平考试
就计算机等级考试、软件初、中、高级不同级别资格考试相关话题交流经验,共享资源。
复制链接
扫一扫
分享
社区描述
就计算机等级考试、软件初、中、高级不同级别资格考试相关话题交流经验,共享资源。
c1认证
c4java
c4前端
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章