zoukankan      html  css  js  c++  java
  • KMP算法

    KMP算法我看了很多次,每次都觉得自己理解了,但是当返回头来用的时候,就又觉得不是很理解,今天我就把思路整理一下好了:

    KMP算法主要有两个部分,1)计算next前缀函数,其实就是一个数组,每个元素储存了如果模式串和Target串在改点匹配不成功时,应该将模式串的那个点与之匹配。

    2)实现模式串匹配

    1)计算前缀函数:

    该函数的基本思想是,找到某一点i前面(包含该点)前缀等于后缀的最大长度:举例:a b a a b a,其中设初始next[1] = 0,next[2]怎么算呢?包括下面几种情况,如果a[2]==a[1],那么next[2] = 1;如果a[2]!= a[1],证明前缀等于后缀的个数为0,那么next[2]=k=0;

    next[3]呢?因为要找前缀和后缀,如果前面已经匹配了a[1],则匹配a[2],如果前面没有匹配a[1],那么就只能从头匹配a[1],在此例中,因为next[2]=0,意味着a[2]未与T匹配,故继续从头匹配。因为a[3]==a[1],next[3]=k=1;

    next[4]呢?正如前面所述,由于next[3]>0,故a[3]已经与T匹配了k个,则a[4]需要和a[k+1]进行匹配,即a[2],由于未匹配成功,故需要继续往前匹配,即a[1],匹配成功,则next[4] = k = 1;

    next[5]呢?正如前面所述,由于next[4]>0,故a[4]已经与T匹配了k个,则a[5]需要和a[k+1]进行匹配,即a[2],由于匹配成功,则next[5] = k = 2;

    next[6]呢?正如前面所述,由于next[5]>0,故a[5]已经与T匹配了k个,则a[6]需要和a[k+1]进行匹配,即a[3],由于匹配成功,则next[6] = k = 3;

    伪代码如下:

    next[1] = 0;//前缀数组

    k = 0;//代表匹配的个数

    for i=2:length

      while k>0 && a[k+1] != a[i]

        k = next[k];

      if a[k+1] == a[i]

        k = k + 1;

      next[i] = k;

    return next

    2)KMP实现

    m = T.length

    n = P.length

    next = 前缀函数返回值

    k = 0;//匹配的个数

    for i = 1: m // 每个元素进行匹配

      while k > 0 && P[k + 1] != T[i]

        k = next[k];

      if P[k+1] == T[i]

        k = k +1;

      if k == m

        return i-n

      k = next[k]//将k移动至next[k]

    end

  • 相关阅读:
    判断一个对象是否为空
    viewflipper的高度设置
    Android利用ViewFlipper实现屏幕切换动画效果
    锁屏状态下点亮屏幕,并弹出闹钟提示信息
    android如何取消闹铃
    luogu P1880(区间dp)
    luogu P2014 选课(树形dp)
    luogu P1122(树形dp)
    luogu P1352 (树形dp)
    luogu P1541 (dp)
  • 原文地址:https://www.cnblogs.com/jiangnanrain/p/4368244.html
Copyright © 2011-2022 走看看