当前课程知识点:数据结构(下) > 第十一章 串(下) > (e1)BM_GS算法:好后缀 > 11e1-2: 好后缀策略
我们来将刚才的实例一般化
也就是说 在BM算法的任何一个时刻
如果当前的这趟扫描失败于X不等于Y处
那么也同时意味着模式串中相应的后缀
必然是完全匹配的
也就是我们所说的好后缀
因此如果接下来希望通过右移
重新在某个位置上对齐
就应该至少使得文本串中刚才匹配的部分能够继续得以匹配
当然还有一条
既然刚才我们已经发现Y不能与X匹配
所以在经过了这次移动之后
对应的这个新的字符
也至少不能依然是Y
就像我们在改进KMP算法时所举的那个例子一样
既然已经发现鸡蛋不如石头硬
我们接下来就至少应该要换一个不是鸡蛋的东西
去与石头相碰
当然 至此只是最为基本的情况
与bc策略一样
这里同样也有若干特殊的情况
比如在模式串中
足以与刚才文本串中匹配的部分继续匹配的子串 有可能会有多个
此时 我们又当选择其中的哪一段呢
这里的取舍原则与bc策略也是一样的
也就是要在安全的前提下
避免回溯
为此 我们同样倾向于让位移量尽可能地小
是的 位移量尽可能地小
这也就意味着 如果的确存在多个这样的子串
我们应该从中选择最靠后者
当然 还有一种反过来的极端情况
也就是说 在模式串中不存在任何一个这样的子串
能够足以与刚才匹配的部分继续匹配
当然 这条信息也就意味着我们此后的对齐位置
至少应该越过当前失配的这个字符
也就是说 移动的距离将会更大
从计算效率的角度来看
这反而是一个好消息
当然 我们同样地需要保证
所有值得对齐的位置 都不至被遗漏掉
因此在这种情况下 我们还是应该尽可能地从模式串中去找到这样一个子串
或者在这种情况下 更准确地讲是一个前缀
使得它至少能与刚才匹配部分的相应后缀继续匹配
现在 纵观以上一般的情况以及各种特殊情况
我们会发现 无论如何位移量只会取决于j
以及模式串P本身
而与文本串无关
这就意味着我们可以仿照KMP算法的模式
提前将相应的位移量计算出来
并将这些信息整理为一张表
以备算法执行过程中能够快速地查询
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)希尔排序:逆序对
-本章测验
--本章测试