码迷,mamicode.com
首页 > 编程语言 > 详细

KMP算法

时间:2020-06-26 12:45:09      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:oid   mic   nbsp   turn   load   快速   alt   png   ext   

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算法

标签:oid   mic   nbsp   turn   load   快速   alt   png   ext   

原文地址:https://www.cnblogs.com/jcahsy/p/13194325.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!