当前课程知识点:数据结构(下) > 第十一章 串(上) > (c1)KMP算法:从记忆力到预知力 > 11c1-2: 不变性
你应该记得 我们在分析蛮力算法时
曾经指出过这个算法的一个不变性
没错 不变性
整个算法过程中的任何一个时刻
都可以表示为这样一幅具有一般意义的插图
是的 在当前假设我们需要对T[i]和P[j]进行比对
并且根据比对的结果
来确定算法的下一步走向
而这里所蕴含的不变性就是
这个子串与这个前缀完全相等
是的 子串与前缀完全相等
这意味着什么呢
是的 这意味着我们已经完全掌握了这个子串的全部信息
也就是说 它具体是由哪些字符所构成的
而这类信息 完全可以为后续的各步比对所利用
还是回到我们刚才的那个例子
考察在当前这步迭代中的最后一次比对 也就是那次失败的比对
正如我们的不变性所指出的
尽管这次比对是失败的
但它却意味着在此前我们已经获得过足够多次成功的比对
就这个例子而言 也就是一系列的0-0匹配
没错 0-0匹配
这一点 其实可以概括为一条非常有用的信息
具体来说也就是
在主串中对应的这个子串 完全是由0构成的
没错 在这种情况下
与模式串前缀所对应的文本串的子串
完全是由0构成的
很可惜 此前的蛮力算法没有注意到并且充分利用这一点
事实上 它会中规中矩地将模式串右移一个字符
然后试图重新与这个子串进行匹配
现在 你应该不难理解
实际上 既然无论是这个子串还是这个前缀 都是完全由0所构成的
所以 它们的任何局部比对 都必然会整体成功
这也意味着 至少在当前的这种情况下
这个子串与这个模式串的任何比对 都会以完全匹配而返回
尽管它们的第一次比对的确有必要
但如果像蛮力算法那样 在此后还反复地将它们进行比对
就显然是没有必要的
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)希尔排序:逆序对
-本章测验
--本章测试