当前课程知识点:数据结构(下) > 第八章 高级搜索树(上) > (b3)B-树:查找 > 08B3-1 算法过程
在给出了B树的结构定义之后
接下来的一个话题自然就是
如何才能充分的利用它 并且有效的维护它
首先来看如何在B树中有效查找
假定这就是一棵B树 我们此前曾经讲过
B树中所存放的词条数量极多
以至于不便完全容纳在内存中 甚至根本不能由内存容纳
因此我们假定它相对的只能存放在速度更慢的外存之中
我们将会看到 所谓B树的查找
其诀窍在于只需要将必须的若干个节点载入内存
也就是说 通过这种策略可以尽可能的减少IO的次数
当然 对于一棵处于活跃状态的B树而言
不妨假设它的根节点已经常驻于内存
现在假设我们需要在这棵树中 查找特定的关键字key
于是我们首先会在常驻于内存的这个根节点中进行一次查找
你应该记得 每个节点中的关键码均已存成一个向量
因此我们这里实施的无非是一个顺序查找
如果能够在某个特定位置命中 我们的查找随即以成功告终
因此我们不妨再来看如果查找失败 又当如何处置
假设失败于一个特定的位置
我们知道在这个特定位置 应该预先已经记录了一个引用
这个引用将会指向B树中下一层的某一个节点
是的 因此我们继而可以沿着这个引用 找到下层的那个节点
并且将它载入到内存之中
也就是说 我们的查找深入一层
而代价呢 是做了一次读入性的IO操作
当然 既然我们已经搜索到这样一个节点
就可以断定 如果目标关键码的确存在于这棵树中
那么就必然存在于这个节点所对应的子树中
于是我们继续在这个新载入的节点中进行一次查找
请注意 借助向量结构 我们在此只需进行一次顺序的查找
同样 我们可能在某个位置命中 从而成功的返回
而反过来 如果在这个节点中的查找以失败告终呢
此时我们在新的这个节点中 也必然会停止于某个适当的位置
而且在这个位置 必然也预先记录了一个引用
使得我们可以顺利的找到在这棵B树中的下一层的某个节点
比如它
同样 如果目标关键码存在于整个B树中
那么至此可以断定 它必然存在与这个节点所对应的这棵子树中
因此为了进一步进行查找 我们也需要再做一次IO
将这个下层的节点载入内存
以下的过程与刚才几乎一样
具体来说 我们也需要在这个新载入的节点中做一次顺序查找
如果成功 完则罢了 否则的话 我们依然借助在失败位置的引用
进而找到再下一层的节点 乃至再下一层 乃至再再下一层
在最坏的情况下 这个过程有可能会反复持续到叶节点
也就是说 充其量我们需要抵达B树底层的一个叶节点
在这里 我们依然需要针对目标关键码 做一次顺序查找
同样 查找可能成功 也可能失败
而且即便失败 也不要紧
因为我们依然可以顺着失败方向的引用 找到下一层的节点
没错 下一层的节点尽管它并不是真实存在的节点
而只是一个虚拟的外部节点
至此 我们就可以报告整个查找以失败告终
当然 还有另外一种情况 也就是这个外部引用
实际上指向的是一棵存放于相对而言更低层次存储级别上的B树
这也是为什么将此类节点称作外部节点
因为借助它们 我们可以将存放于不同存储级别上的B树串接起来
构成更大的B树
当然在此我们不妨只将目光放在当前这一级存储上
而假设查找的确是以失败告终
纵观整个过程 可以看到所谓对B树的查找
无非是由一系列在内存中的顺序查找
以及一系列的IO操作
相间隔组成的一个操作序列
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)希尔排序:逆序对
-本章测验
--本章测试