【数据结构】元叔的课堂笔记:KMP算法的实现(包含lps)2019.10.17
·
lps数组
longest prefix and suffix 简称 lps
lps数组用来存放模式串pat对应子串的最大相同前后缀的长度。
lps代码实现:
void get_lps(char* pat,int* lps)
{
int m = strlen(pat);
int j, i;
j = 0;
i = 1;
lps[0] = 0;
while(i < m)
{
if(pat[i] == pat[j])
{
j++;
lps[i] = j;
i++;
} else{
if(j != 0){
j = lps[j-1];
}else{
lps[i] = 0;
i++;
}
}
}
for (i = 0;i < m; i++)
{
printf("%d",lps[i]);
if(i < m-1)
printf(" ");
}
printf("\n");
next数组
根据lps求出next数组:
将next[0] = -1,然后将lps放入
next代码实现:
void get_next(char* pat,int* lps){
int m = strlen(pat);
get_lps(pat,lps);
int i;
next[0] = -1;
for(i = m - 2; i >= 0 ; i--){
lps[i+1] = lps[i];}
lps[0]= -1;
for(i=0;i<m;i++)
{
printf("%d",lps[i]);
if(i<m-1)
printf(" ");
}
}
KMP 的实现
int kmpsearch(char* s,char* t,int* next)
{
get_next(t,next);
int slen = strlen(s);
int tlen = strlen(t);
int i=0,j=0;
while(i < slen && j < tlen)
{
if(j == -1 || s[i] == t[j])
{
i++;
j++;
}
else
{
j = next[j];
}
}
if(j == tlen)
{
return i-tlen;
}
else
return -1;
}
改进KMP算法
关键在于模式串的回溯,求一种方法可以一步到位(元叔:期末我们再来讲解)
在实际应用中,KMP算法并不比暴力匹配算法快很多,改进KMP算法更是如此
2019.10.17 数据结构课堂笔记
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)