KMP算法

1.目的

在主串中快速,快速,快速地找到目标串

KMP算法_第1张图片

KMP算法_第2张图片

KMP算法_第3张图片

 KMP算法_第4张图片

 2.求解next数组

KMP算法_第5张图片

 

 

 

KMP算法_第6张图片

void getNext(StrNonfix substr,int next[]){
    int j=1,t=0;
    next[1]=0;
    while(j<substr.length){
        if(t==0||substr.ch[j] == substr.ch[t]){
            next[j+1]=t+1;
            ++t;
            ++j;
        }else{
            t=next[t];
        }
    }
}

3.KMP算法

int KMP(StrNonfix str,StrNonfix substr,int next[]){
    int i=1,j=1;
    while(i<=str.length && j<=substr.length){
        if(j==0||str.ch[i] == substr.ch[j]){
            ++i;
            ++j;
        }else{
            j=next[j];
        }
    }
    //模式串在主串中的初始位置 
    if(j>substr.length){
        return i-substr.length;
    }else{
        return 0;
    }
}

4.改进

对KMP算法的改进主要体现在对Next数组的改进上

KMP算法_第7张图片

 KMP算法_第8张图片

 这里假设Pd,Pc,Pb都与Pj相同,Pa与Pj不同。

KMP算法_第9张图片

 1.当Pk不等于Pj时,nextval[k]=next[k]=j;

2.当PK等于Pj时候,nextval[k]=nextval[next[k]]=nextval[j];

 

 KMP算法_第10张图片

void getNextval(StrNonfix substr,int nextval[]){
    int j=1,t=0;
    nextval[1]=0;
    while(j<substr.length){
        if(t==0||substr.ch[j] == substr.ch[t]){
            if(substr.ch[j+1] !=substr.ch[t+1]){
                nextval[j+1]=t+1;
            }else{
                nextval[j+1]=nextval[t+1];
            }
            ++t;
            ++j;
        }else{
            t=nextval[t];
        }
    }
}

 

你可能感兴趣的:(KMP算法)