KMP匹配算法源码

本文介绍了KMP(Knuth-Morris-Pratt)模式匹配算法,通过避免回溯提高匹配效率。阐述了算法原理,如何计算next数组,并分析了算法的时间复杂度。最后给出了算法的实现代码。
摘要由CSDN通过智能技术生成

        模式匹配问题,即字符串的匹配,int index(String t,String p),求p在t中第一次出现的位置。如何高效地匹配?先来讨论朴素的回溯的模式匹配。例如,设t=“abbaba”,p=“aba”,p的长度为6(plen=6),t的长度为3(tlen=3)。匹配过程如下:

        算法如下:

int index(string p, string t)
{
    int i = 0, j = 0;           //i,j分为p,t串当前字符的下标
    while(i<p->n && j<t->n){    //反复比较
        if(p->c[i] == t->c[j]){
            i++; j++;           //继续匹配下一个字符
        }
        else{
            j = j - i + 1;      //p,t串的i,j回溯,即重新开始下一次匹配
            i = 0;
        }
    }
    if(i >= p->n)
        return(j - i +1);       //匹配成功,返回p中第一个字符在t中的序号
    else
        return 0;               //匹配失败
}

 

       这种算法效率不高,在最坏的情况下,每趟比较都在最后出现不等,最多比较 tlen-plen+1 趟,总比较次数为 plen×(tlen-plen+1),由于在一般情况下plen<<tlen,所以算法的运行时间为O(plen× tlen)。

 

        对于上图的匹配过程,由(a)可知:p0=t0,p1=t1,p2!=t2,

由p0!=P1可知p0!=t1,将p右移一位后(b)的比较一定不等;

由p0==p2可知p0!=t2,将p再右移一位后(c)的比较一定不等;

        因此,由(a)便可直接将p右移3位跳到(d),从p0和t3开始作比较,很快可以匹配成功。这样的匹配过程对字符串 t 就消除了回溯。

        这种快速的算法也就是,在右移若干位后,立即用p串中的一个新的字符Pk(k<i)和tj

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值