匹配位置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了吧?

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

原文地址:https://www.cnblogs.com/xinyuyuanm/p/3065661.html