4.4 KMP算法

一、KMP算法代码

int Index_KMP(SString S,SString T,int next[]){
    int i=1,j=1;
    while(i<=S.length&&j<=T.length){
        if(j==0||S.ch[i]==T.ch[j]){
            ++i;
            ++j;			//j
        }
        else
            j=next[j];		//模式串向右移动
    }
    if(j>T.length)
        return i-T.length;	//匹配成功
    else
        return 0;
}
//next数组:当模式串的第j个字符匹配失败时,令模式串跳到next[j]再继续匹配,next[1]=0
//j的取值:
串的前缀:包含第一个字符,且不包含最后一个字符的子串
串的后缀:包含最后一个字符,且不包含第一个字符的子串

当第j个字符匹配失败,由前1~j-1个字符组成的串几位S,则:next[j]=S的最长相等前后缀长度+1
特别的:next[1]=0
核心就是先求出next数组

二、KMP算法性能分析

//求模式串T的next数组
void get_next(SString T,int next[]){
    int i=1,j=0;
    next[1]=0;
    while(i<T.length){
        if(j==0||T.ch[i]==T.ch[j]){
            ++i;
            ++j;
            //如果pi=pj,则next[j+i]=next[j]+1
            next[i]=j;
        }
        else
            //否则令j=next[j],循环继续
            j=next[j];
    }
}

//KMP算法
int Index_KMP(SString S,SString T){
    int i=1,j=1;
    int next[T.length+1];
    get_next(T,next);	//求模式串的next数组
    while(i<=S.length&&j<=T.length){
        if(j==0||S.ch[i]==T.ch[j]){
            ++i;
            ++j;	//继续比较后续字符
        }
        else
            j=next[j];	//模式串向右移动
    }
    if(j>T.length)
        return i-T.length;	//匹配成功
    else
        return 0;
}

三、KMP算法优化

KMP算法优化:当子串和模式串不匹配时j=nextval[j]
对next数组进行优化
next[j]------->nextval[j]:
//nextval数组的求法:先算出next数组,先令nextval[1]=0,然后:
for(int j=2;j<=T.length;j++){
    if(T.ch[next[j]]==T.ch[j])
         nextval[j]=nextval[next[j]];
    else
         nextval[j]=next[j];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值