当前课程知识点:数据结构(下) > 第十一章 串(下) > (d3)BM_BC算法:构造bc[] > 11d3: 画家策略
这里 我们就给出bc表一种可能的构造算法
我们知道 bc表需要为字母表中的每一个字符准备一个表项
二者的长度相等
因此 我们首先就要为它开辟出这样的一个空间
比如 长度为256
接下来 我们需要通过一趟循环遍历
将所有表项的初值
统一设为-1
如果你能从设置哨兵的角度来看待这一操作
那么就可以非常清晰地理解这步操作的涵义
是的 这样等效于将所有的表项都统一地指向那个通配的哨兵
接下来又是一趟循环
这一个循环将遍历整个模式串
逐一地枚举出其中的每一个字符
并用这个字符所对应的秩
来更新对应的bc表项
请注意 即便同一个字符在模式串中出现了多次
按照这种方法
依然可以按照我们的要求正确地设置好对应的bc表项
其原因在于
我们这里采用的是自左向右的扫描次序
而整个计算过程采用的正是画家的策略
也就是说 在画布上的任何一个位置
后画上去的颜料必然会覆盖掉此前所画的颜料
而当画家作画完毕时
每一个位置所体现的颜色
是取决于在那个位置上留下的最后一笔
因此就bc表而言
任何一个字符所对应表项的最终取值
是取决于它在模式串中出现位置最靠后的那一次
可以看到
在空间上 这里的消耗主要来自于
bc表本身
因此 空间复杂度应该线性正比于字母表的规模
构造bc表所需的时间主要花费在两次for循环上
前者 依然线性正比于字母表的规模
而后者 则线性正比于模式串的长度
在这里 有一个非常有趣的问题
也就是说
第一趟循环实际上是可能省略的
而且这种方法是通用的
可以适用于任何散列表的初始化
如果你对此感兴趣
同样可以参考我们所提供的习题解析中的对应习题
那么 使用如此构造出来的bc表
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)希尔排序:逆序对
-本章测验
--本章测试