当前课程知识点:数据结构(下) > 第十一章 串(下) > (d4)BM_BC算法:性能分析 > 11d4-1: 最好情况
以下 就让我们从最好情况的角度
来考察坏字符策略的性能
实际上 在最好情况下的性能之好
要远远超过我们的想象
具体来说 此时的时间成本
可以度量为O(n/m)
没错 除法
你能构造出
这样的一个具体实例吗
这就是一个
可以看到 模式串完全由0组成
而文本串呢
则由与模式串等长的
若干个片段 依次拼接而成
在每一个片段中
末字符都不是0 比如说 取作1
而其余的字符呢
实质上都无所谓
因此笼统地记作x
我们不妨就此例来走一遍BM算法
第一次对齐的位置
在这里
而首次比对就是0/1的失配
在这里 0就是坏字符
而且在模式串中 根本就找不到足以与1匹配的字符
于是 BM算法将会把模式串整体地移过这个失配的位置
并使之与文本串中的下一个片段彼此对齐
而接下来的故事 与刚才的那个片段完全一样
首先 末字符0无法与1匹配
而且其余的0也不能与之匹配
因此算法将再次整体地后移模式串
以致再次、再再次 持续地整体移动下去
纵观整个过程
每经过常数次的比对
我们就可以向后整体地移动m个字符
既然文本串累计不过n个字符
因此在这种情况下 算法至多会移动n/m次
由此可见 在这种情况下
算法的确只需要运行这么多的时间
即便是相对于KMP而言
这也是一个极大的提高
更不用说蛮力算法了
这个例子并不失一般性
实际上 只要P中的字符
都是坏字符
那么每次我们都可以整体地对它进行移动
也就是说 我们只需要常数次的比较
就可以整体地排除掉m个对齐位置
由此可见 如果说KMP算法是个利用经验的高手
那么BM算法则是非常善于借鉴教训的高手
从这个意义上讲
BM算法更加欢迎失败比对的出现
那么 在什么情况下 更容易出现失败的比对呢
也就是说 对于任何一对随机出现的字符所做的比对
失配的概率 在什么情况下 更小呢
在这里 我们再次回到那样一个重要的指标
也就是字母表的规模
实际上 字母表的规模越大
单次匹配成功的概率也就越小
失配的概率 也就越大
从而 BM算法的优势也就更为明显
比如 在处理汉字甚至Unicode编码时
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)希尔排序:逆序对
-本章测验
--本章测试