41|串的KMP模式匹配算法观察:理解困难
王健伟
你好,我是王健伟。
上节课我带你学习了串的朴素模式匹配算法,这种算法思想简单,执行效率不高。为什么这么说呢?我带你仔细分析一下。
朴素模式匹配算法的问题
串的朴素模式匹配算法经常可以看到主串的指针 point1 回退的情形。导致匹配时间增加。看一下图 1:
图1 串的朴素模式匹配算法【步骤1】
图 1 中,在主串中寻找子串“google”内容,开头的“googl”都相同,但比较到第 6 个字符时,主串内容为‘o’,子串内容为‘e’,此时情形如图 2 所示:
图2 串的朴素模式匹配算法【步骤2】
那么 point1 指针就要从下标为 5 的位置回退到下标为 1 的位置,为什么回退到下标为 1 的位置呢?其实很容易看得出来,只需要把子串位置向右移动一个位置,而后子串的开头字符对应的是哪个下标,主串的指针 point1 就回退到哪个下标位置,下一次比较就是主串中下标 1 位置的字符 o 与子串的开头位置的字符 g 作比较。如图 3 所示:
图3 串的朴素模式匹配算法【步骤3】
其实,整个串的朴素模式匹配算法的执行过程也可以看作是子串不断右移与主串对应位置字符逐个比较的过程。这个过程中,point1 指针在字符比较失败的情况下往往需要回退(左移)若干位置来重新与子串的各个字符比较,整个算法的执行效率显然不会很高。
正是因为串的朴素模式匹配算法是比较低效的,所以又提出了 KMP 算法。KMP 算法是一种改进的字符串匹配算法,由 D.E.Knuth,J.H.Morris 和 V.R.Pratt 三位大神提出的,因此人们称它为克努特—莫里斯—普拉特算法(简称 KMP 算法)。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
KMP模式匹配算法是一种改进的字符串匹配算法,旨在提高执行效率。相较于朴素模式匹配算法,KMP算法通过利用匹配失败后的信息,尽量减少子串与主串的匹配次数,从而实现快速匹配。其核心思想是让主串中的指针不回退,甚至子串一次可能会右移多个位置,以提高执行效率。KMP算法通过观察子串中的公共前后缀,并将公共前缀移动到公共后缀的位置,实现了子串向后移动多个位置,从而提高匹配效率。文章详细解释了KMP算法的实现原理、步骤、核心移动方法,并介绍了“前缀”“后缀”“最长公共前后缀”等概念,帮助读者深入理解算法的执行过程。KMP算法的代码实现特点是简短,但实现理论却很晦涩、难以理解。通过本文的总结,读者可以快速了解KMP模式匹配算法的特点和核心思想,为进一步深入学习和应用提供了基础。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《快速上手 C++ 数据结构与算法》,新⼈⾸单¥68
《快速上手 C++ 数据结构与算法》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(2)
- 最新
- 精选
- TableBear老师会讲next数组的构造吗?
作者回复: 会呀,坚持下去,很快就到啦
2023-05-17归属地:广东1 - Bruder_Jin图16下图应该是错了吧,point2应该指向位置2,但是图中指向位置3了2023-06-28归属地:广东
收起评论