当前课程知识点:数据结构(下) > 第十一章 串(下) > (d2)BM_BC算法:坏字符 > 11d2-1: 坏字符
实际上 刚才的实例中我们所展示的那样一个计算过程
也就是所谓BM算法所采用的策略之一
而这一策略 将我们刚才所说的教训
称作坏字符
在这里 我们不妨改为基于蛮力算法的第二个版本来进行改造
也就是说 模式串中当前参与比对的如果是字符P[j]
那么 文本串中对应的就是T[i+j]
这幅图画出的就是这样一个一般性的场景
请注意 当前这趟扫描
如果的确已经抵达P[j]
或T[i+j]
则说明在这对字符的右侧 有一段足够长的匹配部分
而相对于模式串而言
这个匹配的部分是一个后缀
既然这两个字符失配
我们就不妨就分别将它们记作X和Y
延续我们在刚才的分析中所采用的逻辑
如果我们将这次失配
当作一次教训
那么其原因就可以解释为
在Y这个位置
我们本来期望是一个X
然而这个字符Y的出现
却使得我们在此局部获得一次完整匹配的希望成了泡影
因此 BM算法也将这个字符Y称作坏字符
正是因为这个坏字符的出现
当前这个对齐位置
也就自然地可以被排除掉了
那么 更重要的是
这次教训能够为我们带来什么启示呢
具体地 能为我们后续的比对 提供什么有意义的借鉴呢
将刚才我们所举的实例推而广之
如果我们还希望能够在这个字符X附近
实现一次完整的匹配
那么作为一项必要条件
与这个字符X对准的
也应该至少是一个X
是的 由刚才所举的实例推而广之
我们也同样可以得出此时的处置方法
具体来说 就是试图从模式串中去找出这样的一个字符X
并且通过相应的移动
使得这个X能与文本串中的那个X彼此对齐
而一旦完成了这样的对齐
我们又可以继而从最右端开始
启动下一轮的扫描比对
那么 对应于每一个这样的场景
相应的位移量又应该是多少呢
稍加观察 我们不难发现
这个位移量
仅取决于刚才失配的位置j
以及对应的字符X
在模式串中的位置
而与文本串以及当前的对齐位置没有任何关系
这就意味着我们可以与KMP算法一样
通过预处理 事先计算出每种情况下对应的位移量
也就是说 我们可以将每一个这样的字符所对应的位移量
制成一个表
也就是所谓的bc表
通过再进一步的观察我们不难发现
这个表只需记录每一个字符X在模式串中所对应的秩
在图中 也就对应于这一段距离
我们知道 这段前缀的长度恰好就应该是j
而对应的位移量
也自然就应该是
这两段前缀的长度之差
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)希尔排序:逆序对
-本章测验
--本章测试