当前课程知识点:数据结构(下) > 第十一章 串(上) > (c2)KMP算法:查询表 > 11c2-2: 主算法
我们现在就来考察KMP的主算法
可以看到 无论接口形式
还是算法的主体流程
KMP与我们此前蛮力算法的版本一
都颇为类似
是的 它的确是在版本一的基础上
略加修改而得的
尽管在形式上 这种改动非常地细微
但是在本质上 却有巨大的区别
首先 这里增加了一步预处理
也就是构造出我们刚才所说的那份查询表
我们称之为next表
正如我们刚才所言
这个构造过程 仅仅取决于模式串
而与文本串没有任何关系
因此是名副其实的预处理
接下来与蛮力算法一样
我们也需要两个整数 i和j
分别指向文本串和模式串中当前接受比对的那一对字符
算法的主体循环也基本类似
if分支完全一样
差异仅仅体现在else分支
可以看到 KMP算法在失配情况下的处理更为简明
具体来说 只需从查询表中取出j所对应的那一项
并且用它来替换此前的j
请注意 在这种情况下 KMP并没有修改变量i
也就是说 它依然指向文本串中此前刚刚失配的那个字符
这样的处理过程 可以由这幅插图来说明
请再次确认 此时情况也就是
在当前的这轮比对中
主串的字符T[i]与模式串的字符P[j]首次发生了失配
在算法中 也就对应于那个else分支
在这种情况下 如果此前模式串所对应的那个前缀长度为j
那么接下来 KMP算法将会把这个前缀
替换为长度为next[j]的那个新的前缀
并从刚才失配的那个位置出发 继续下一轮比对
当然 细心的你可能会发现
相对于蛮力算法
这里的if分支也并非完全地一样
是的 在对应的逻辑判断式中
这里新增了一个并列的条件
j<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)希尔排序:逆序对
-本章测验
--本章测试