zoukankan      html  css  js  c++  java
  • 匹配位置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了吧?

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

  • 相关阅读:
    Ceph相关
    Redis学习
    docker mysql
    WebSocket学习与使用
    nginx学习与使用
    python学习小记
    基数计数——HyperLogLog
    Swagger使用小记
    理解Java枚举类型
    Jenkins使用
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3065661.html
Copyright © 2011-2022 走看看