当前课程知识点:数据结构(下) > 第十一章 串(上) > (c6)KMP算法:再改进 > 11c6-3: 前车之覆
实际上 这个算法的主体流程并没有任何的问题
而在另一个方面 我们又注意到
控制KMP算法流程走向的
与其说是这个算法本身
不如说是它背后的那张查询表
没错 next查询表
这张next表既是算法策略的体现者
也是每一个模式串中所蕴涵信息的具体承载者
它简明地刻画了每一个模式串的本质特征
而在当前 它只不过是刻画得还不完全而已
为什么这么讲呢
我们还是需要从next表的语义定义来说起
比如 这个字符
它所对应的next表项为2
其对应的语义是说
在它所对应的这个长度为3的前缀中
存在一个长度为2的真前缀与同样长度为2的真后缀完全匹配
而且这也是如此的最长匹配
因此在经过相应的滑动之后
这两个部分也就会自然而然地匹配
从而无需对它们重新比对
是的 KMP在这一方面的确显得非常聪明
因为它充分地利用了我们在此前的比对中所业已获得的信息
这类信息是正面的
因为它们告诉我们 相对于当前这个失配字符
它的前缀都是由哪些字符所构成的
形象地说 这类信息 就相当于我们通常所说的经验
然而 以往的经历所能告诉我们的不光有正面的经验
还应该有负面的信息
比如 教训
是的 在串匹配的计算过程中
这两方面的信息都是有的
实际上 相对于当前这个失配的字符
我们不仅能够知道它所对应的前缀是什么
而且 反过来我们也应该能知道这个字符不应该是什么
难道这不正是教训吗
很遗憾 KMP算法目前的这个版本还不能及时地汲取这方面的教训
以至于它会一而再 再而三地重复这个错误
与所有问题一样
一旦你能够定位它
其实也就解决了它的一大半
通过以上的分析
既然我们已经发现KMP还不能够吸取教训
那么改进的方法也自然就是
使它具有这种能力
比如 一种可行的解决方法就是
在确定各个字符所对应的next表项时
除了此前自相似的必要条件
我们还需增加一个新的条件
这个条件与刚才自相似的条件恰好相反
大体而言 自相似条件就等价于说
在这个前缀中存在哪些自相似的特征
而新增补的这个条件恰恰相反
它要指出新的这个字符必须与此前的那个字符不一样
新的这个物体 尽管未必要比石头要更硬
但是 它至少不应该仍然是一枚鸡蛋
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)希尔排序:逆序对
-本章测验
--本章测试