KMP算法的理解

简介

  KMP 算法是 D.E.Knuth、J,H,Morris 和 V.R.Pratt 三位神人共同提出的,称之为 Knuth-Morria-Pratt 算法,简称 KMP 算法。该算法相对于 Brute-Force(暴力)算法有比较大的改进,主要是消除了主串指针的回溯,避免多次比较, 从而使算法效率有了某种程度的提高。

①,初始化KMP ,通过一个数组确定模式串中,p[j]!=t[i] 不相等,next[j] 此刻j回溯到的位置(j=new[j]),然后再次比较,等于-1时候,需要i右移动,概括的说,模式串下次位置的前K个P(0..K-1)等于P(J-K..J-1) ,以此表明前K个已经比较过,相等,不需要回溯到j=0位置。

static void kmp_init(const char *p, int *next, int size) {

    if(size<2) //如果只有1个
    {
        next[0]=-1;
        return ;
    }
    next[0] = -1; //这个是固定的
    next[1] = 0;
    int k=1;
    int i=1;
    while(i<(size-1))
    {
        k=i;
        while(1)
        {
            if(p[i]==p[next[k]])
            {
                next[++i]=next[k]+1;
                break;
            }
            else  //不相等的情况
            {
                k=next[k];
                if(next[k]==-1)
                {
                    next[++i]=0;
                    break; //直接退出
                }
            }
        }
    }
}

 

int kmp_pattern(char *src ,char *pattern)
{
    int pat_size=strlen(pattern);
    int src_size=strlen(src);
    int *next=(int *)malloc(sizeof(int)*pat_size);
    kmp_init(pattern,next,pat_size);

    int i,j;
    for (i=0,j=0;i<src_size&&j<pat_size;) {

       if(src[i]==pattern[j])
       {
           i++;
           j++;
       }
       else
       {
            j=next[j];
            if(j==-1)  //需要i往后移动
            {
                j=0;
                i++;
            }
       }
    }

    if(j==pat_size)
    {
        return (i-pat_size);
    }
    else
    {
        return -1;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值