KMP

View Code
#include <stdio.h>
void perfix(char P[],int U[],int lenP);
void match(char T[],char P[],int U[],int lenT,int lenP);
void perfix(char P[],int U[],int lenP){
    U[0]=-1;
    int k=-1;
    int i=1;
    for(;i<lenP;i++){
        while(P[k+1]!=P[i]){
            if(k==-1) break;
            k=U[k];
        }
        if(P[k+1]==P[i])
            k=k+1;
        U[i]=k;
    }
}
void match(char T[],char P[],int U[],int lenT,int lenP){
    int m=lenP;
    int n=lenT;
    int k=U[0];
    int i=0;
    for(;i<n;i++){
        while(k>-1&&P[k+1]!=T[i]){
            if(k==-1)  break;
            k=U[k];
        }
        if(P[k+1]==T[i]){
            k++;
            if(k==(m-1)){
                printf("location is %d\n",i-k);
                k=U[k];
            }
        }
    }
}

int main(){
    char P[6]={'a','b','a','b','c','a'};
    char T[9]={'c','a','a','b','a','b','c','a','b'};
    int U[6];
    perfix(P,U,6);
    match(T,P,U,9,6);
    return 0;
}

KMP算法是一种线性查找匹配算法,在长度为n的字符串中查找长度为m的字符串所花费的时间为n.

如果是传统的字符串匹配,那么需要的时间是m*n。

 

感觉自己基础不牢固。问题1,char P[6]={'a','b','a','b','c','a'};
                                               char T[9]={'c','a','a','b','a','b','c','a','b'};

在void perfix(char P[],int U[],int lenP);中P的值为P+T,因为在声明字符数组是没有加入结束标志,所以编译器不知何时结束。在C中‘\0’作为字符串的结束标志,加与不加都不会报错,但是如果不加就不好判断字符串何时结束,解决方法是在参数中加入数组元素的个数。

                                    问题2,char P[6]={'a','b','a','b','c','a'};sizeof(P)=6。但是在void perfix(char P[],int U[],int lenP);中sizeof(P)=4.因为在函数参数中char P[]其实就是char *P,指针自身长度就是4。

posted on 2012-06-03 13:25  蓝色守望  阅读(153)  评论(0)    收藏  举报

导航