请高手详细讲讲KMP算法(谢谢先)

free12345 2004-11-03 08:27:27
偶看此算法时觉的书上讲的很乱,而且有的地方有些问题,请高手帮忙讲一下。
...全文
380 20 打赏 收藏 转发到动态 举报
写回复
用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格
  • 打赏
  • 举报
回复
假设文本串“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
  • 打赏
  • 举报
回复
顶一下先
  • 打赏
  • 举报
回复
这个要说明白还真不容易。我当初也想了大半天不明白。试这样想想,如果你要自己设计这个算法,你要怎么样做?

如果是考高程的话,估计不会考这个。倒是考研常考这个。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
会手工求这两个,大部分考试都能应付
  • 打赏
  • 举报
回复
相较于传统的简单比较算法,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.如此反复一直到找到匹配。

2,948

社区成员

发帖
与我相关
我的任务
社区描述
就计算机等级考试、软件初、中、高级不同级别资格考试相关话题交流经验,共享资源。
c1认证c4javac4前端 技术论坛(原bbs)
社区管理员
  • 软件水平考试社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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