当前课程知识点:数据结构(下) > 第十一章 串(上) > (c1)KMP算法:从记忆力到预知力 > 11c1-4: 预知力
依然回到我们已经多次使用的这个二进制串的实例
根据刚才的分析 在当前这轮比对失败于模式串的末字符之后
即便我们依然只能向后移动一个字符
但相对于新的P[j]而言
整个前缀都无需重复比对了
也就是说 我们只需从上一次失败的位置出发
继续进行下一轮的比对
正所谓 从哪里跌倒的 就从哪里爬起来
实际上 即便是对于更为复杂的例子
也依然存在此类优化的可能
比如这就是一例
其模式与刚才类似
也就是说 相对于当前这个对齐位置
我们所做的一轮比对首次失败于E和O之间的失配
请注意 在这种情况下我们完全不必亦步亦趋地右移模式串
而是可以大胆地将它后移3个字符
也就是说 此前的两个对齐位置都可以排除掉
你能看出这背后的原因吗
没错 如果一个位置值得对齐
那么它的一个必要条件就是
所对应的首字符
应该与模式串的首字符一样
也是R
而在这种情况下
无论E或G 都不是R
这里我们再强调一次
关于这个子串的所有信息
都是我们通过前一轮的比对所获得的
而通过这两个实例我们已经确实地看到
只要我们能够对这类信息充分加以利用
就可以获得两个方面的优化效果
一方面 我们可能大幅度地向后滑动模式串
而另一方面 我们也可避免大量重复的比对
而为了同时兑现这两个方面的优化
我们的算法实际上只需具有某一种预知力即可
具体来说也就是 在每一次失败之后
我们应该将模式串中的哪一个字符与文本串中刚才失败的那个字符彼此重新对齐
并继续从这个位置开始进行比对
在这个例子中 也就是要确定这个0
而在这个例子中 相应的对齐位置也就是这个E
那么具体地 又当如何来确定此类继任字符的位置呢
为此我们需要花费多少时间和空间
而且更重要地 既然是作为预知力
我们的算法 能否在事先就提前确定此类继任字符的位置呢
好消息是 所有这些 都是可能的
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)希尔排序:逆序对
-本章测验
--本章测试