匹配位置KMP算法深入浅出
最近研究匹配位置,稍微总结一下,以后继续补充:
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了吧?
文章结束给大家分享下程序员的一些笑话语录:
神灯新篇
一个程序员在海滩上发现了一盏神灯。他在灯上擦了几下,一个妖怪就从灯里跳出来说:“我是世界上法术最强的妖怪。我可以实现你的任何梦想,但现在,我只能满足你一个愿望。”程序员摊开了一幅中东地图说:“我想让中东得到永久的和平。”妖怪答道:“哦,我没办法。自打创世纪以来,那里的战火就没有停息过。这世上几乎没有我办不到的事,但这件事除外。”程序员于是说:“好吧,我是一个程序员,为许多用户编写过程序。你能让他们把需求表述得更清楚些,并且让我们的软件项目有那么一两次按进度按成本完成吗?”妖怪说:“唔,我们还是来看中东地图吧。”