《数据结构与算法》KMP算法01
Posted 飞鱼说编程
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《数据结构与算法》KMP算法01相关的知识,希望对你有一定的参考价值。
1.KMP算法简介
KMP 算法是( D.E.Knuth、J.H.Morris 和 V.R.Pratt )的研究成果,大大的避免重复遍历的情况,全称叫做克努特-莫里斯-普拉特算法,简称 KMP 算法。
回顾 BF 算法,为什么效率低下:
比如,在第五个位置,j 和 i 不匹配时,i 就会回溯到第二个位置与 j 的第一个位置从头开始比较,回溯就是坚持条条大道通罗马的决心,然后遇到挫折就回到跌倒的地方重新爬起来,继续往前,这种思想是好的,但是效率是低下的!
2.KMP算法思路启发1
(1)思路启发一
我们观察上面两个字符串 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)思路启发二
我们观察上面两个字符串 S、T:
其中:
i1 == j1,i2 == j2,i1 == i2 == i3
j1 == j2,j2 != j3
所以,我们就需要将 j1 匹配到 i2,然后将 j2 与 i3 进行匹配。
(3)思路启发三
我们观察上面两个字符串 S、T:
其中:
i1 == j1,i2 == j2,i3 == j3,i1 == i2 == i4 == i5
j1 == j2,j1 != j3,j2 != j3
虽然我们可以看到 i6 与 j6 不匹配,但是我们却不知道从 i6,j3 开始匹配,之后是否能够匹配,所以我们需要从这里开始。
(4)思路启发四
通过思路启发三,我们很轻易的可以得到上面的思路启发四,当前面的字符都是一样的情况下,突然出现一个不相同的,我们可以把字符串 T 往回移动一步,然后与字符串 S 的最后一个字符匹配,看是否能够匹配成功。
本文是本人在学习数据结构与算法时的笔记,如果觉得对你有帮助,不要忘了点赞,评论,转发哟!!!
可以点击阅读原文查看博客原文哦!
上一篇:
以上是关于《数据结构与算法》KMP算法01的主要内容,如果未能解决你的问题,请参考以下文章