当前课程知识点:数据结构(下) > 第十一章 串(上) > (c6)KMP算法:再改进 > 11c6-1: 美中不足
以上 我们不仅给出了KMP算法
同时也证明它的时间复杂度已经达到了渐进意义上的最优
也就是最坏情况也不超过O(n)
然而该算法目前的这个版本
也绝非完美无缺
接下来我们就会看到
在某一方面 它依然存在一个细微的瑕疵
我们要针对这一缺陷
对它再作改进
为了揭示其中仍然存在的问题
我们从这样一个反例入手
首先确认 对于这样一个模式串
这里给出的 的确是它的next查询表
与所有情况一样
KMP算法首先将文本串与模式串
在首字符位置对齐
并启动第一轮的字符比对
不难看出 在经过3次成功的比对之后
算法将首次失配于这一对字符
于是根据算法的流程
接下来 我们应该将模式串中的这个字符
替换为它对应的next表项所指的那个字符
也就是2号字符
因此接下来等效于将模式串向右侧滑动一个单位
从而按照next表的语义
将2号字符与刚才失配的那个文本串字符对齐
并再做一次比对
诚然 这次比对依然会失败
因此接下来我们将去查询2号字符在next表中所对应的那一项
也就是1
从效果上看
这依旧等价于将模式串再向右滑动一个单位
从而以1号字符 也就是它
或者说它 与文本串中失配的这个字符再次对齐
并再做一次比对
同样不难看出 这次比对也会以失败返回
因此我们又会继而去查询这个字符 也就是这个字符所对应的next表项
并按照这个表项的指示
将0号字符 也就是首字符或者说它
与文本串中刚才失配的那个字符对齐
并随即做一次字符的比对
再一次地 这次比对依然会以失败返回
于是根据算法的逻辑
我们将去查询这个字符
也就是首字符在next表中所对应的表项
从而将假想存在的那个通配哨兵
与文本串中失配的字符对齐
当然 既然是通配符
这次比对也必然会成功
从而算法终于得以越过这个位置
而从下一对字符开始
继续进行下去
当然 我们这里的重点并不在于再次地验证一下KMP算法在这种极端情况下的正确性
事实上 我们更加关注度的 是KMP算法在这种情况下的性能表现
回顾刚才所展示的整个过程
文本串中失配的那个字符
先后与模式串中的4个字符进行了比对
才最终在第5个 也就是通配字符处
得以匹配
事实上 如果说第一次比对还是有意义的话
那么 后续的3次比对实际上都是多余的
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)希尔排序:逆序对
-本章测验
--本章测试