当前课程知识点:数据结构(下) > 第十一章 串(上) > (b1)串匹配 > 11b1-1: 问题与需求
好 接下来我们就对这一章的主角儿 也就是串匹配问题 作一概述
包括这个问题是什么 有哪些不同层次的功能要求 以及如何评测相应算法的性能
尽管我们还没有涉及到具体的算法
如果你使用Unix或Linux 那么对于grep这个命令肯定就不会陌生
这个支持正则表达式搜索的命令功能非常强大
其中最基本的一项功能就是 在某个文本中去查找特定的模式串
比如 这就是一次成功的查找 因为我们注意到people这个单词的确在上面这个句子中出现了
其实 类似的这种搜索 在当下是无处不在、无时不在的
想想你在Google或百度上 通过关键词搜索网页
就不难理解这一点
是的 对于这类搜索引擎来说
你所输入的关键词 就相当于这里的模式串
而文本串T呢
是的 它们是Internet上所有的网页
由此 我们也可以看出此类问题的一个鲜明特点
这体现在两个串的长度上
按照我们的惯例 通常都将文本串和模式串的长度分别记作n和m
通常 m本身就足够大 因此不能视作是一个常数
例如 你所搜索的关键词 通常都由几十个到一百个字符组成
另一方面 相对于已经比较大的m而言
n的规模 又要比m大上若干个甚至很多个数量级
仍然以刚才的搜索引擎为例
整个Internet上所有网页的长度之和 必然是惊人的
即便是单张网页 其规模也通常在几十到几百K
当然 我们所说的模式匹配问题
从功能和难度上 可以分为若干个递进的层次
首先 是所谓的检测 detection
也就是说 我们只关心模式串是否在文本串中出现过
至于出现在哪儿 以至于出现多少次
相对而言我们都不是那么关心
比如病毒的监控系统
更在意的是病毒的特征码在对应的邮件或文件中是否出现
只有不包含特征码的邮件或文件 才允许通过
当然 接下来的一个层次自然是定位
也就是说 如果模式串出现 我们还关心它具体出现在文本串中的哪个位置
例如 你在一份很长的网页上要查找某个特定的入口 就需要用到这样的功能
当然 通常而言 模式串有可能会出现多次
而此时 我们有可能会关心它总共出现过几次
比如 根据一份学生的花名册
借助这种功能 我们就可以统计出特定届次的学生总数
当然 再进一步地
是所谓的enumeration 枚举问题
也就是说 我们需要知道模式串在文本串中具体都出现在哪几个位置
比如在刚才的例子中 我们有可能需要进一步地确定 特定届次的学生具体是哪几位
纵观这4个层次 不难发现 其中核心的 是第2个层次
实际上 只要这个层次的问题 能够得以高效地求解
后续的问题 也自然可以迎刃而解
因此 这一层次的问题 也是我们在这一章中将主要讨论的范畴
鉴于串匹配问题的特殊性 在给出具体的算法之前
我们需要首先来确定 应该如何地测量和评判 此类算法的性能
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)希尔排序:逆序对
-本章测验
--本章测试