当前课程知识点:数据结构(下) > 第十一章 串(下) > (e3)BM_GS算法:综合性能 > 11e3-2: 各算法纵览
在结束本节之前 让我们通过这样一组图
来对串匹配的各种典型算法在性能上作一对比
这里的纵轴表示运行时间
而这3个标尺
由低到高 分别表示n/m n+m 以及n*m
正如我们已经知道的
对于蛮力算法而言
在最坏情况下的运行时间将达到最多的n*m
然而我们也曾指出
蛮力算法在最好情况下的运行时间 也大致在线性的幅度
而在这两种极端情况之间
最大的一个影响因素
实际上是某个概率
也就是所谓 单次比对的成功概率
就蛮力算法而言
这个概率越高
它也就越容易误入歧途
从而导致非常高的时间复杂度
反过来 在这个概率并不是很高的时候
蛮力算法的性能将很自然地接近于线性
实际上 在通常的意义上
决定这一概率值的最大因素
莫过于字母表本身的规模
实际上 单次匹配成功的概率
大致与字母表的规模成反比
我们再来看KMP算法
我们已经证明
无论在什么情况下
它的性能都始终稳定在线性的水平
由此可见 只有在字母表规模非常小的情况下
KMP算法相对于蛮力算法在性能上的优势才会充分地体现出来
这幅图是仅采用bc策略的BM算法
我们可以看到 它非常适用于大字符集
当单次匹配成功的概率极低时
它的性能将接近于O(n/m)
当然 在字母表规模很小时
bc策略依然很容易误入歧途
从而导致极高的 O(n*m)的复杂度
而只有在将bc策略与gs策略联合使用时
二者才可以相得益彰
可以看到 联合使用这两种策略
在最好情况下我们依然可以实现O(n/m)的运行时间
同时 bc策略的缺点也会得到有效的抑制
并保证在最坏情况下
运行时间也不超过线性
我们也可以从性能的维度
从最低到最高
划分为3个阶次
这是蛮力算法
它在最好情况下
也不过线性
而在一般甚至最坏情况下
它都需要O(n*m)的时间
这里是bc策略
可以看到 它的性能变化幅度极大
从最好的O(n/m)一直到最坏的O(n*m)
而KMP在这儿
可以看到 它是中规中矩的
始终保持线性的时间复杂度
最后是融合了bc和gs两种策略的BM算法
我们可以看到 在最坏的情况下
它也只需线性的运行时间
而在最好的情况下
它甚至可以达到O(n/m)
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)希尔排序:逆序对
-本章测验
--本章测试