当前课程知识点:数据结构(下) > 第十一章 串(上) > (b1)串匹配 > 11b1-2 算法测评
关于算法的性能评测
在第一章中 我们也已介绍过一般性的原则和方法
那些总体的原则和方法 在此自然仍可适用
但是鉴于串匹配问题的特殊性
为了更为客观而准确地评判相应算法的性能
我们需要对相应的标准和策略 作针对性的细化与调整
例如 参照其他算法通用的模式
我们很有可能首先会想到将这里的输入 也就是文本串T以及模式串P 同时作随机采样
然后通过数学上的概率分析 或实际测量的统计
来评判算法的性能
然而很遗憾 这种生搬硬套的模式 并不适用于模式匹配这一问题
什么原因呢
其背后的根本原因在于
关于什么是查找成功与失败
现在这一问题 与我们此前所遇到的问题
已有本质的区别
比如 我们此前所谓的x是否等于y
完全是一对一的
然而在这里 情况已经大不相同
具体来说 无论是主串 还是模式串
都是由多个元素 也就是字符 组成的
两个串在某种意义下的相等
意味着多对字符的同时相等
也就是说 此时匹配成功的概率 必然会远远地低于匹配失败的概率
我们不妨以二进制串为例
对于这样的字符表 我们知道长度为m的模式串 总共可能会有2^m种
而在T中 所有长度为m的子串 累计也不会超过n个
尽管我们讲过 通常n会远远地大于m
但是m本身也并非是常数
因此 如果是以2为底的幂次
又会反过来 远远地大于n
因此 如果按照刚才完全随机的测试方法
匹配成功的概率 应该不会超过n/2^m
这个数大致是多大呢
依然参照刚才我们网页搜索的那个实例作为估算
将n大致取作10^5
将m大致取作10^2
经过封底估算 我们知道分母大致是10^30
因此这个概率不会超过10^-25
如此之低的概率 完全有可能会被任何一种微小的波动所掩盖
因此 这种测试方法 的确是非常不妥的
那么 反过来 又有什么行之有效的方法呢
实际上 一种简明有效的方法就是将成功与失败的情况分别考虑
针对失败的情况 我们可以继续沿用以前完全随机的方法
而针对成功的情况 为了更准确地评估算法的性能
我们就需要将文本串中所有长度为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)希尔排序:逆序对
-本章测验
--本章测试