当前课程知识点:数据结构(下) > 第十一章 串(上) > (c5)KMP算法:分摊分析 > 11c5-2: 精准估计
为了对KMP算法的性能作出更为精细的分析
我们可以参照在第一章就确立的方法
将这个算法中 不涉及到实质计算内容的非迭代部分都删除掉
而将注意力集中于复杂度的主体 也就是其中的这个循环
在这里 我们需要引入一个观察量k
在算法执行过程中的任何时刻
这个k都等于2*i-j
实际上 在很多开发环境中
都提供了观察功能
允许你设置这样一个表达式
并且在算法的调试运行过程中
动态地给出表达式所对应的数值
实际上 随着算法中这个迭代过程的不断推进
这个观察变量k 必然是单调递增的
这一性质并不难看出
实际上无非if和else两种可能
首先 如果当前这步迭代
选取的是if分支
那么 根据算法的流程
i和j会同步地递增一个单位
于是作为2*i-j k应该恰好增加一个单位
反之 如果当前这步迭代进入的是else分支
那么 尽管i不会受到任何影响
但是j会被替换为它对应的next表项
你应该记得我们此前已经指出
j所对应的那个next表项
必然会严格地小于j
也就是说 经过这样一次替代之后
在数值上 j必然会严格地减少
所以k也至少会增加一个单位
综合这两种情况我们就会发现
k随着迭代的进行
的确会严格单调地不断递增
因此 整个计算过程中所进行的迭代步数
就绝对不会超过k
也就是说
只要我们能够界定k的上界
也就自然确定了整个算法复杂度的上界
那么 k的变化幅度究竟是多大呢
首先 既然i和j的初值都是0
所以k的初值也应该是0
而在算法结束时
i至多与n同阶
而j呢 也至少是一个常数
这也就意味着在渐进的意义上
k绝对不会超过线性的范围
至此 我们也就确凿地给出了KMP算法性能的一个准确估计
是的 这里给出的估计方法非常初等
因此其结论也毋庸置疑
当然 作为进一步的探求 你或许会好奇于这里的k
也就是2*i-j的具体含义
如果你的确对这一问题感兴趣
不妨参考我们所提供的习题解析
当然 作为KMP算法的有机组成部分
我们也不要忘了next表的构造过程
然而正如我们已经看到的
这个预处理算法的原理及过程与主算法完全相同
因此 其复杂度也应该线性正比于它自己的输入规模 也就是模式串的长度m
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)希尔排序:逆序对
-本章测验
--本章测试