快速上手 C++ 数据结构与算法
王健伟
《C++ 新经典》系列作者,资深 C++ 讲师
3224 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 55 讲
结束语 (1讲)
快速上手 C++ 数据结构与算法
15
15
1.0x
00:00/00:00
登录|注册

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
立即购买
登录 后留言

全部留言(2)

  • 最新
  • 精选
  • TableBear
    老师会讲next数组的构造吗?

    作者回复: 会呀,坚持下去,很快就到啦

    2023-05-17归属地:广东
    1
  • Bruder_Jin
    图16下图应该是错了吧,point2应该指向位置2,但是图中指向位置3了
    2023-06-28归属地:广东
收起评论
显示
设置
留言
2
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部