KMP算法

Posted jcahsy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KMP算法相关的知识,希望对你有一定的参考价值。

1.目的

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

技术图片

技术图片

技术图片

 技术图片

 2.求解next数组

技术图片

 

 

 

技术图片

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数组的改进上

技术图片

 技术图片

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

技术图片

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

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

 技术图片

 技术图片

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算法的主要内容,如果未能解决你的问题,请参考以下文章

数据结构—串KMP模式匹配算法

Python ---- KMP(博文推荐+代码)

KMP算法及Python代码

KMP算法及Python代码

图解KMP算法原理及其代码分析

Kmp算法Java代码实现