当前课程知识点:数据结构(下) > 第十一章 串(下) > (d4)BM_BC算法:性能分析 > 11d4-2: 最坏情况
然而另一个方面很遗憾
BM算法在最差情况下的性能
也的确非常差
具体来说 它的算法复杂度
有可能会退化到蛮力算法的水平
也就是O(n*m)
就此 你能举出一个具体的实例吗
我可以给你一点提示
你不妨去参考一下
蛮力算法最坏情况的那个实例
是的
我想你已经想到了
就是这个
这一次 文本串倒是完全由0组成的
而模式串 也几乎是由0组成的
唯一的例外 是它的首字符
按照BM算法的流程
我们首先需要从末字符开始进行比对
而且我们会经历一系列的成功
直到最后一步才失败
可以看到 在这次失败之前
我们已经花费了O(m)的成本
然而最糟糕的还不是这个
因为 我们花费了如此之高的成本所换来的那个教训
居然对我们不会有太多的帮助
因为此时 正属于我们此前所讲的那种最为特殊的情况
也就是说 坏字符的替代者应该是0
但是在模式串中
最后出现的那个0过于靠后
以至于如果我们需要将它与此前的失配字符对齐
将导致模式串的左移而不是右移
因此在这种情况下
我们只好搬出那个假想的通配哨兵
并用那个通配的哨兵
与这个失配的字符相对齐
非常可惜
这样的效果
只相当于模式串向右移动一个单位
没错 我们每花费O(m)的成本
换来的收获只是向后移动了一步
而总体呢
共有n步
因此在这种情况下的总体计算成本
的确应该是n与m的乘积
我们不妨来反思一下
BM算法当前的这个版本
为何还有可能会出现如此之差的情况呢
没错 经验
我们已经看到
BM算法目前的这个版本的确已经能够很好地借鉴教训
也正因为此 它才能够在最好情况下有出色的表现
然而很遗憾 到目前为止它还没能够有效地利用好经验
具体来说 也就是此前的那些成功比对所提供的有益信息
实际上 完整的BM算法的确也可以同时很好地利用这方面的信息
为此 我们需要给BM算法增加一个策略
也就是所谓的好后缀策略
这个策略 再加上我们刚刚介绍的坏字符策略
就可以使得BM算法变得几乎完美
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)希尔排序:逆序对
-本章测验
--本章测试