KMP (看毛片算法) 养成篇 (一)(启发篇)

来源:互联网 发布:java实现99乘法表 编辑:程序博客网 时间:2024/03/29 05:31

http://blog.fishc.com/2274.html

本系列全是经典算法,绝无特别简单和特别难以理解的算法。

 

让编程改变世界

Change the world by program


 

KMP算法

 

相信很多鱼油(包括小甲鱼自己)在刚开始接触KMP算法的时候始终是丈二和尚摸不着头脑,要么完全不知所云,要么看不懂书上的解释,要么自己觉得好像心里了解KMP算法的意思,却说不出个究竟,所谓知其然不知其所以然是也。

 

KMP算法对大多数初学者来言是一项比较巨大的考验,特别是自学算法的朋友,很多资料对数学功底不牢固的学者来说看起来比较模糊。

所以,小甲鱼在讲解这一算法的实现前,特地添加了这一篇章:最高作战方针之算法思路养成篇!

 

KMP算法是三位老前辈(D.E.Knuth、J.H.Morris 和 V.R.Pratt)的研究结果,大大的避免重复遍历的情况,全称叫做克努特-莫里斯-普拉特算法,简称KMP算法或看毛片算法。

 

上节课我们谈了BF算法,也说了BF算法虽然很黄很暴力,但是效率却不搞。

我们也给了一个例子。但似乎那个例子不足以反映出导致这种算法效率低下的致命缺陷。

 

因此,我们用下边一个例子来继续探讨:

 

 

回溯就是坚持条条大路通罗马的决心,然后遇到挫折就回到跌倒的地方重新爬起来,继续往前,这种思想是好的,但效率是低的。

因为牛在耕田的时候也是这么想的,但人家袁隆平懂得找捷径,才有了超级杂交水稻,这也告诉我们鱼油,学习除了勤奋,除了必要坚持,还更需要思考!

 

KMP算法的核心就是避免不必要的回溯,那么什么是不必要的呢?问题由模式串决定,不是由目标决定!

 

思路启发一

 

 

思路启发二

 

思路启发三

 

 

思路启发四

 

 

注重思考不要注重结果

 

如果平时有阅读鸟文计算机书籍的朋友会发现很多教学书籍都有课后习题,但大部分不会附带答案,市面也不会有所谓的“答案全解”。

其实在老外的教学中,他们更加注重思考而非正确的结果。回想我们之所以会这么在意答案完全是中国式教育的产物,在我们的学校,分数就是一切!

 

在小甲鱼的所有教学中,我希望大家可以培养独立思考的精神,因为为这是创新的根源所在!

希望鱼油们可以通过以上引导,自己推导出KMP算法的原理!