当前课程知识点:数据结构(下) > 第十一章 串(上) > (b2)蛮力匹配 > 11b2-1: 构思
好 在接下来的这节 我们就来介绍所谓的蛮力串匹配算法
顾名思义 这类算法的思路与策略 都是直截了当的 非常直观且易于理解
但是反过来 这个名字也暗示着 它的效率是非常低下的
不过 这类算法 也有它的存在价值
它们可以帮助你理解串匹配的计算过程
同时 也为我们后续的改进 提供了一个起点与参照
我们这里所说的蛮力算法 在思路上的确是直截了当的
我们不难发现 所谓的匹配成功 必然是相对于某一个对齐位置而言的
这样的对齐位置 充其量不会超过文本串的长度 也就是n
因此 如果不在意计算的成本
我们只需逐一地尝试并核对每一个对齐位置
也自然就可以解决 串匹配的问题
而这样最自然的一种方式 莫过于自前向后
以单个儿字符为间隔
依次地将模式串与文本串对齐 并进行核对
我们来看这样一个实例
在一个相对更长的文本串中 查找一个长度为4的模式串
按照刚才所说的策略 我们首先要将二者的首字符彼此对齐
然后将模式串中的每一个字符 分别与主串中对应的字符进行比对
如果这样的比对依然也是自左向右的话
于是我们就会发现 二者最前端的两个字符 都是匹配的
也就是 1对1 0对0
然而很不幸 接下来却是1对0
我们称之为失配
显然 只要有一对儿字符是失配的
那么整体就不可能完全匹配
因此 这也就意味着 当前的这个对齐位置是可以排除掉的
因此接下来 我们需要尝试下一个对齐位置
就效果而言 这等同于文本串保持不动 而模式串向右侧滑动一个字符
一旦这样对齐之后 我们就会随即启动一轮逐个字符的比对
我们可以看到 当前的这一轮比对 会失配于首字符处
这也意味着第二个对齐位置也可排除
于是接下来 我们可以将模式串继续向后滑动一个字符
从而尝试下一个对齐的位置
在接下来的这轮比对中 依然存在失配
因此 这个对齐位置 也会被淘汰掉
接下来 我们再进而尝试下一个对齐位置
新的一轮比对在经过了一次成功之后 依然遇到了一次失配
这也意味着 这个对齐位置 也是可以排除的
于是接下来 我们再次地向后移动模式串 并尝试新的一个对齐位置
非常幸运 在这样一个对齐位置 所有的字符都是匹配的
这也意味着 当前的这个对齐位置 就是一个成功的匹配
如果我们暂且不关心这个算法的效率
它的正确性是显而易见的
那么 这样的一个计算过程 应该如何地表述为代码呢
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)希尔排序:逆序对
-本章测验
--本章测试