当前课程知识点:数据结构(下) > 第十一章 串(上) > (c4)KMP算法:构造next[]表 > 11c4-1: 递推
接下来的这节 我们就来讨论next查询表的构造算法
我们将会看到 非常有意思的是 next表的构造过程与KMP主算法的流程在本质上是完全一样的
在这里 我们不妨采用递推策略
我们只需回答这样一个一般性的问题即可
也就是说由低至高 如果我们已经构造到了next表的第j项
那么接下来又当如何进而构造出j+1项
在此 我们需要再次重温next表的定义
也就是说 这个表中所谓的第j项
也就是在模式串长度为j的那个前缀中
自我匹配的真前缀与真后缀的最大长度
由此 我们自然就可得知
在数值上 next表中的任何一项
相对于此前的那项
至多只可能增长一个单位
通过反证法 这一点不难得到
具体的证明细节 留给你在课后完成
进一步地 这个不等式取等号的充要条件是
在模式串P中
编号为j的字符与它按照next表的继任者彼此相等
比如在这幅图中
P[j]就是这个字符
而它的继任者则为这个字符
根据next表的定义
以这条线为界 P的这个前缀与它的这个子串必然是完全匹配的
因此如果P[j]与它的继承者也是相等的
这种自匹配的长度自然就会增加一个单位
因此在这种情况下
next表中的第j+1项 也自然地就应该在此前第j项的基础上再递增一个单位
这样 我们也就证明了这个充要条件“当”的那个方向
为了进而再证明“仅当”
我们只需考察P[j]与它的替代者不相等的情况
比如后者为Y
此时 在这个长度为j+1的前缀中
任何一对自匹配的真前缀和真后缀
也必然蕴含着在此前长度为j的那个前缀中自匹配的一对真前缀和真后缀
而且新的那对真前缀和真后缀的长度 也必然相对于此前那对 要增加一个单位
而由于next表中的各项都是对应于自匹配的最大长度
因此 新的自匹配长度绝对不可能超过此前的自匹配长度
那么倘若P[j]果真与它的继任者不等
我们又该如何计算出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)希尔排序:逆序对
-本章测验
--本章测试