《数据结构与算法》KMP算法01

Posted 飞鱼说编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《数据结构与算法》KMP算法01相关的知识,希望对你有一定的参考价值。


1.KMP算法简介


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

回顾 BF 算法,为什么效率低下:


《数据结构与算法》KMP算法01


比如,在第五个位置,j 和 i 不匹配时,i 就会回溯到第二个位置与 j 的第一个位置从头开始比较,回溯就是坚持条条大道通罗马的决心,然后遇到挫折就回到跌倒的地方重新爬起来,继续往前,这种思想是好的,但是效率是低下的!


2.KMP算法思路启发1


(1)思路启发一


《数据结构与算法》KMP算法01


我们观察上面两个字符串 S、T:

其中:

i1 == j1,i2 == j2,i3 == j3,i4 == j4

j1 != j2,j1 != j3,j1 != j4;j2 != j3,j2 != j4;j3 != j4

由此可以得出,i1  != j2,i1 != j3,i1 != j4;i2 != j3,i2 != j4;i3 !=j4

所以,我们不需要回溯,再从 i2 与 j1 进行匹配,而只需要从 i5 开始于 j1 进行匹配!


(2)思路启发二


《数据结构与算法》KMP算法01


我们观察上面两个字符串 S、T:

其中:

i1 == j1,i2 == j2,i1 == i2 == i3

j1 == j2,j2 != j3

所以,我们就需要将 j1 匹配到 i2,然后将 j2 与 i3 进行匹配。


(3)思路启发三


《数据结构与算法》KMP算法01


我们观察上面两个字符串 S、T:

其中:

i1 == j1,i2 == j2,i3 == j3,i1 == i2 == i4 == i5

j1 == j2,j1 != j3,j2 != j3

虽然我们可以看到 i6 与 j6 不匹配,但是我们却不知道从 i6,j3 开始匹配,之后是否能够匹配,所以我们需要从这里开始。


(4)思路启发四


《数据结构与算法》KMP算法01


通过思路启发三,我们很轻易的可以得到上面的思路启发四,当前面的字符都是一样的情况下,突然出现一个不相同的,我们可以把字符串 T 往回移动一步,然后与字符串 S 的最后一个字符匹配,看是否能够匹配成功。  


本文是本人在学习数据结构与算法时的笔记,如果觉得对你有帮助,不要忘了点赞,评论,转发哟!!!

可以点击阅读原文查看博客原文哦!

上一篇:


以上是关于《数据结构与算法》KMP算法01的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法 字符串匹配的KMP算法

学习数据结构笔记(18) --- [KMP算法]

数据结构与算法之深入解析KMP算法的核心原理和实战演练

数据结构与算法简记--字符串匹配KMP算法

数据结构与算法之KMP算法

数据结构kmp算法中的next函数