当前课程知识点:数据结构(下) > 第十一章 串(上) > (c4)KMP算法:构造next[]表 > 11c4-3: 实现
next表的构造算法可以具体实现如下
正如我们刚才所分析的
其总体框架应该与KMP的主算法几乎一样
主要的差别有这么几点
首先 入口参数只有模式串自己
这一点不难理解
因为我们刚才讲过 整个next表的构造过程就是它自己与自己的匹配
因此在这个场合 P既是模式串 也是文本串
另一点区别在于初始化
我们刚才已经分析过
next表的首项 也就是第0项
数值必然固定为-1
因此我们不妨首先就完成这一设置
接下来是我们业已非常熟悉的KMP循环
其中的if和else分支
分别对应于当前匹配与失配的两种情况
按照我们刚才的分析 一旦发现一对新的匹配字符
我们就可以立即得出next表的下一项
而且它的数值就应该是在此前一项的基础上再累进一个单位
反过来 如果是失配
根据我们刚才的分析
也只需将当前的尝试位置t 更新为它所对应的next表项
当然 根据我们刚才业已指出的单调性
这个表项 当前必然已经计算出来
所以你尽可放心
这幅图也给出了该算法的一次典型运行过程
假设我们正需要递推地计算出下一项
此时 我们的P[j]是这个X
首先尝试的是next[j]
如果对应的字符与P[j]不等
也就对应于循环中的else分支
于是我们会将next[j]进而替换为next[next[j]]
并且继续用对应的这个字符与P[j]进行比对
如果依然不等
我们就需要将next[next[j]]进一步地替换为next[next[next[j]]]
在任何一步迭代中
一旦当前的字符与P[j]相等
我们就可以立即将下一个next表项设置为 在这个前缀的长度基础上 再累进一个单位
当然 这个迭代的过程有可能会进行很多步
但是正如刚才我们所分析的那样
充其量不过迭代到这样一种状态
也就是当假想的那个哨兵
与P[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)希尔排序:逆序对
-本章测验
--本章测试