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;
}