当前课程知识点:数据结构(下) > 第十一章 串(上) > (c2)KMP算法:查询表 > 11c2-1: 制表备查
接下来我们就来看看
KMP算法究竟如何兑现我们刚才所提及的记忆力以及预知力
我们将会看到 这种方法非常地便捷与高效
本质上讲 它无非就是构造了一张查询表
回到我们刚才的问题
在当前这轮比对 首次失败于T[i]与P[j]之后
我们应当如何地向后滑动模式串
从而等效地以一个新的P[j]来与刚才的T[i]对齐
并从这个位置开始
继续新一轮的比对
这里的好消息是
新的这个P[j]不仅可以事先确定
而且这个位置仅取决于模式串
而与主串无关
你能看出 为什么与主串没有关系吗
是的
事实上 在这样的一个时刻 主串无非4个部分
也就是文本串的这个前缀以及后缀
再加上 在当前这一轮已经匹配的这个子串 以及失配的这个字符
不难看出
这个前缀与后缀
对于新的这个P[j]字符 的确没有任何影响
而这个子串
表面上看 对它有所影响
但正因为这个子串
与模式串的前缀是匹配的
所以与其说这种影响是来自于文本串
不如说最终还是来自于模式串
能否看透这一点
对于我们以下理解KMP算法至关重要
既然下一个接替的字符完全取决于模式串自身
由此出发 再进一步地
与其说 这个接替的字符是取决于模式串
不如说 它取决于被它顶替的此前的那个P[j]
事实上 在一个长度为m的模式串中
这样的字符P[j]无非m种情况
而KMP算法在此处的关键诀窍在于
将所有这m种情况事先处理 并且归纳整理为一张查询表
在经过了这样的预处理之后
在后续的各轮比对中
一旦在某一位置P[j]处发生失配
我们只需简单地从查询表中取出对应的那一项
并用它来更新此前的j
由此可见 这种策略与其说是在借助强大的记忆力
不如说是在事先 已经为各种情况准备好了充分的预案
那么 基于这种以查询表的形式给出的预案
KMP算法又是如何具体工作的呢
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-OJ系统说明
--关于OJ
--1-注册与登录
--2-界面与选课
--3-提交测试
-关于课程教材与讲义
--课程教材与讲义
-关于讨论区
--关于讨论区
-微信平台
--html
-PA晋级申请
--PA晋级
-(a)概述
--07A-1 纵览
--07A-5 接口
-(a)概述--作业
-(b1)BST:查找
-第七章 二叉搜索树--(b1)BST:查找
-(b2)BST:插入
-(b2)BST:插入--作业
-(b3)BST:删除
-第七章 二叉搜索树--(b3)BST:删除
-(c)平衡与等价
-(c)平衡与等价--作业
-(d1)AVL树:重平衡
-第七章 二叉搜索树--(d1)AVL树:重平衡
-(d2)AVL树:插入
-(d2)AVL树:插入--作业
-(d3)AVL树:删除
-(d3)AVL树:删除--作业
-(d4)AVL树:(3+4)-重构
-(d4)AVL树:(3+4)-重构--作业
-本章测验
--章节测验
-(a1)伸展树:逐层伸展
--习题
-(a2)伸展树:双层伸展
--习题
-(a3)伸展树:算法实现
--习题
-(b1)B-树:动机
--习题
-(b2)B-树:结构
--习题
-(b3)B-树:查找
--习题
-(b4)B-树: 插入
--习题
-(b5)B-树: 删除
--习题
-(xa1)红黑树:动机
--习题
-(xa2)红黑树:结构
--习题
-(xa3)红黑树:插入
--习题
-(xa4)红黑树:删除
-本章测验
--习题
-(b)散列:原理
--09B-3 数组
--09B-4 原理
--09B-5 散列
--09B-6 冲突
--习题
-(c)散列:散列函数
--习题
-(d1)散列:排解冲突(1)
--习题
-(d2)散列:排解冲突(2)
--习题
-(e)桶/计数排序
--习题
-本章测验
--本章测试
-(a1)需求与动机
--习题
-(a2)基本实现
--习题
-(b1)完全二叉堆:结构
--习题
-(b2)完全二叉堆:插入与上滤
--习题
-(b3)完全二叉堆:删除与下滤
--习题
-(b4)完全二叉堆:批量建堆
--习题
-(c)堆排序
--习题
-(xa1)左式堆:结构
--习题
-(xa2)左式堆:合并
--习题
-(xa3)左式堆:插入与删除
-本章测验
--本章测试
-(a)ADT
--习题
-(b1)串匹配
--习题
-(b2)蛮力匹配
--习题
-(c1)KMP算法:从记忆力到预知力
--习题
-(c2)KMP算法:查询表
--习题
-(c3)KMP算法:理解next[]表
--习题
-(c4)KMP算法:构造next[]表
--习题
-(c5)KMP算法:分摊分析
--习题
-(c6)KMP算法:再改进
-(d1)BM_BC算法:以终为始
-(d2)BM_BC算法:坏字符
-(d3)BM_BC算法:构造bc[]
-(d4)BM_BC算法:性能分析
-(e1)BM_GS算法:好后缀
-(e2)BM_GS算法:构造gs表
-(e3)BM_GS算法:综合性能
-(f1)Karp-Rabin算法:串即是数
-(f2)Karp-Rabin算法:散列
-本章测验
--本章测试
-(a1)快速排序:算法A
-- 12a1-5: 实例
--习题
-(a2)快速排序:性能分析
--习题
-(a4)快速排序:变种
-(b1)选取:众数
-(b3)选取:通用算法
--习题
-(c1) 希尔排序:Shell序列
--习题
-(c2)希尔排序:逆序对
-本章测验
--本章测试