您的位置:首页 > 其它

匹配位置KMP算法深入浅出

2013-05-07 21:39 246 查看
最近研究匹配位置,稍微总结一下,以后继续补充:

S: ababcababa

P: ababa

KMP法算与BF法算的别区就在于KMP法算妙巧的消除了指针i的溯回问题,需只肯定下次匹配j的位置便可,使得问题的复杂度由O(mn)下降到O(m+n)。

在KMP法算中,为了肯定在匹配不成功时,下次匹配时j的位置,引入了next[]数组,next[j]的值表现P[0...j-1]中最长缀后的度长即是雷同字符序列的前缀。

对于next[]数组的义定如下:

1) next[j] = -1 j = 0

2) next[j] = max(k): 0<k<j P[0...k-1]=P[j-k,j-1]

3) next[j] = 0 其他

如:

P a b a b a

每日一道理

如果说友谊是一颗常青树,那么,浇灌它的必定是出自心田的清泉;如果说友谊是一朵开不败的鲜花,那么,照耀它的必定是从心中升起的太阳。 多少笑声都是友谊唤起的,多少眼泪都是友谊揩干的。友谊的港湾温情脉脉,友谊的清风灌满征帆。友谊不是感情的投资,它不需要股息和分红。(友谊可以换其他词语)

j 0 1 2 3 4

next -1 0 0 1 2

其实如果这段你得觉很难看懂(实确开始挺难看懂的),那么我们就现实的比量一下

next[0]=-1,next[1]=0,这个就是约定俗成了,不管它了。其余的j,就是相当于p[0,j-1]这个串里,重合度最高的那两个字串,它们的度长,这两个字串要足满什么件条呢?第一个子串的开始位置是0,第二个子串的开头位置是j-1,上例中next[4]为什么即是2?因为p[0,4]=abab,而abab重合度最高的就是ab,它恰好也足满上述件条,于是next[4]=2.

再例:

T a b a a b d

j 0 1 2 3 4 5

next -1 0 0 1 1 2

这回较比白明了吧?当然这个next的表现,有人是以-1作为基数的,有人为0作基数,都不打紧,你要是意愿以0作基数,那每一个next元素上都+1就完了呗,为了近接计算机表现法,我还是持支以-1作为基数

next算出来了,然后怎么用呢?

在匹配过程当中,先从若产生不匹配的情况,如果next[j]>=0,则标目串的指针i稳定,将模式串的指针j移动到next[j]的位置继续进行匹配;若next[j]=-1,则将i右移1位,并将j置0,继续进行较比。

这回可以很快地从S中找到P了吧?

文章结束给大家分享下程序员的一些笑话语录:

神灯新篇

一个程序员在海滩上发现了一盏神灯。他在灯上擦了几下,一个妖怪就从灯里跳出来说:“我是世界上法术最强的妖怪。我可以实现你的任何梦想,但现在,我只能满足你一个愿望。”程序员摊开了一幅中东地图说:“我想让中东得到永久的和平。”妖怪答道:“哦,我没办法。自打创世纪以来,那里的战火就没有停息过。这世上几乎没有我办不到的事,但这件事除外。”程序员于是说:“好吧,我是一个程序员,为许多用户编写过程序。你能让他们把需求表述得更清楚些,并且让我们的软件项目有那么一两次按进度按成本完成吗?”妖怪说:“唔,我们还是来看中东地图吧。”
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: