×

kmp 算法 算法 模式匹配

KMP模式匹配算法是什么?数据结构的知识

admin admin 发表于2022-04-27 06:13:32 浏览159 评论0

抢沙发发表评论

KMP模式匹配算法是什么

KMP模式匹配算法是一种改进算法,是由D.E.Knuth、J.H.Morris和v.R.Pratt提出来的,因此人们称它为“克努特-莫里斯-普拉特操作”,简称KMP算法。此算法可以在O(n+m)的时间数量级上完成串的模式匹配操作。其改进在于:每当一趟匹配过程出现字符不相等时,主串指针i不用回溯,而是利用已经得到的“部分匹配”结果,将模式串的指针j向右“滑动”尽可能远的一段距离后,继续进行比较。

1.KMP模式匹配算法分析回顾图4-5所示的匹配过程示例,在第三趟匹配中,当i=7、j=5字符比较不等时,又从i=4、j=1重新开始比较。然而,经仔细观察发现,i=4和j=1、i=5和j=1以及i=6和j=1这三次比较都是不必进行的。因为从第三趟部分匹配的结果就可得出,主串中的第4、5和6个字符必然是b、c和a(即模式串第2、第2和第4个字符)。因为模式中的第一个字符是a,因此它无须再和这三个字符进行比较,而仅需将模式向右滑动2个字符的位置进行i=7、j=2时的字符比较即可。同理,在第一趟匹配中出现字符不等时,仅需将模式串向右移动两个字符的位置继续进行i=2、j=1时的字符比较。由此,在整个匹配过程中,i指针没有回溯,如图1所示。

图1改进算法的模式匹配过程示意

数据结构的知识

很多同学对数据结构算法的第一印象,可能是觉得它复杂、深奥、难学。也可能会觉得它不常用,因为在平时的开发过程中,好像不怎么用到数据结构算法。

那我们为什么还要学习数据结构算法呢?

一个很重要的原因,是为了应对面试。数据结构算法,可以说是名企面试必考的。也就是说,国内外一线的大型互联网公司,在面试的过程中,多多少少都会问一些数据结构算法的题目。规模越大的公司,就越注重数据结构算法。甚至,现在中小型公司的面试都开始问算法题了。其实,不管什么行业,为了筛选出更优秀的人才,随着时间的推移,面试的难度肯定都会越来越高的。-kmp 算法

今年李明杰MJ小码哥创始人的第一次公开课就是讲述《数据结构与算法》课程大纲:

  • 数据结构算法这块的知识点本来就比较多,有些概念也比较复杂,要想彻底搞清楚,肯定需要花多一点时间。

  • 而且我讲解每个知识点的时候,都会讲得比较细致、比较深入,也会做一些额外的扩展。

  • 另外,我觉得同学们应该要嫌我讲得少啊,应该让我讲得更多一点

  • 同学们也可能看到其他的一些数据结构算法教程,只有10几个小时,甚至是几个小时。时间短,就说明讲得不够详细不够系统。这样的后果是什么呢?你听了1个小时的课程,可能需要花至少5~10个小时的时间去消化吸收,还要自己去慢慢琢磨。如果老师讲解地很细致,你就能理解地更加透彻,那你课后复习巩固所花的时间就少了-算法

如何用C语言求两个数的最大公约数的三种算法

1、相减法

#include《stdio.h》

int main()

{

int a,b;

int c=0;//计数器

while(1)//循环判断的作用

{

printf(“输入两个数字求最大公约数:“);

scanf(“%d%d“,&a,&b);

while(a!=b)

{

if(a》b)

a=a-b;

else

b=b-a;

c++;

}

printf(“最大公约数是:%d\n“,a);

printf(“%d\n“,c);

}

return 0;

}

运行效果:

2、辗转相除法:

#include《stdio.h》

int a,b,temp;

int Division(){

printf(“请输入两个数(a,b):\n“);

scanf(“%d,%d“,&a,&b);

if(a《b){

temp=a;

a=b;

b=temp;

}

while(a%b!=0){

temp=a%b;

a=b;

b=temp;

}

printf(“最大公约数为:%d\n“,b);

return 0;

}

3、穷举法

#include《stdio.h》

int main()

{

int a,b,c;

int d=0;//计数器

while(1)

{

printf(“输入两个数字求最大公约数:“);

scanf(“%d%d“,&a,&b);

c=(a》b)?b:a;//三目运算符

while(a%c!=0||b%c!=0)

{

c--;

d++;

}

printf(“最大公约数是:%d\n“,c);

printf(“%d\n“,d);

}

return 0;

}