B树满足的条件

B树是一种多路搜索树(并不是二叉的):

1.定义任意非叶子结点最多只有M个儿子;且M>2;

2.根结点的儿子数为[2, M];

3.除根结点以外的非叶子结点的儿子数为[M/2, M];

4.每个结点存放至少M/2-1(取上整)和至多M-1个关键字;(至少2个关键字)

5.非叶子结点的关键字个数=指向儿子的指针个数-1;

6.非叶子结点的关键字:K[1], K[2], …, K[M-1];且K[i] < K[i+1];

7.非叶子结点的指针:P[1], P[2], …, P[M];其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树;

8.所有叶子结点位于同一层;

其结构可以简单定义为:

typedef struct {/*文件数*/int  file_num;/*文件名(key)*/char * file_name[max_file_num];/*指向子节点的指针*/BTNode * BTptr[max_file_num+1];/*文件在硬盘中的存储位置*/FILE_HARD_ADDR offset[max_file_num];
}BTNode;

下面动图是往B树中依次插入6 10 4 14 5 11 15 3 2 12 1 7 8 8 6 3 6 21 5 15 15 6 32 23 45 65 7 8 6 5 4

再举个例子说明B树的查找过程,如下图:(M=3)

为了简单,这里用少量数据构造一棵3叉树的形式,实际应用中的B树结点中关键字很多的。上面的图中比如根结点,其中17比表示一个磁盘文件的文件名;小红方块表示这个17文件内容在硬盘中的存储位置;p1表示指向17左子树的指针。

假如每个盘块可以正好存放一个B树的结点(正好存放2个文件名)。那么一个BTNODE结点就代表一个盘块,而子树指针就是存放另外一个盘块的地址。

下面,咱们来模拟下查找文件29的过程:

1、根据根结点指针找到文件目录的根磁盘块1,将其中的信息导入内存。【磁盘IO操作 1次】
此时内存中有两个文件名17、35和三个存储其他磁盘页面地址的数据。根据算法我们发现17<29<35,因此我们找到指针p2。
2、根据p2指针,我们定位到磁盘块3,并将其中的信息导入内存。【磁盘IO操作 2次】
此时内存中有两个文件名26,30和三个存储其他磁盘页面地址的数据。根据算法我们发,26<29<30,因此我们找到指针p2。
3、根据p2指针,我们定位到磁盘块8,并将其中的信息导入内存。【磁盘IO操作 3次】
此时内存中有两个文件名28,29。根据算法我们查找到文,29,并定位了该文件内存的磁盘地址。
4、分析上面的过程,发现需要3次磁盘IO操作和3次内存查找操作。关于内存中的文件名查找,由于是一个有序表结构,可以利用折半查找提高效率。至于IO操作时影响整个B树查找效率的决定因素。

当然,如果我们使用平衡二叉树的磁盘存储结构来进行查找,磁盘4次,最多5次,而且文件越多,B树比平衡二叉树所用的磁盘IO操作次数将越少,效率也越高。

【数据结构】B树的理解相关推荐

  1. 数据结构显示树的所有结点_您需要了解的有关树数据结构的所有信息

    数据结构显示树的所有结点 When you first learn to code, it's common to learn arrays as the "main data struct ...

  2. 数据结构 | B树、B+树、B*树

    文章目录 搜索结构 B树 B树的插入 B树的遍历 B树的性能 B+树 B+树的插入 B+树的遍历 B*树 B*树的插入 总结 搜索结构 如果我们有大量的数据需要永久存储,就需要存储到硬盘之中. 但是硬 ...

  3. python 树状数组_【算法日积月累】19-高级数据结构:树状数组

    树状数组能解决的问题 树状数组,也称作"二叉索引树"(Binary Indexed Tree)或 Fenwick 树. 它可以高效地实现如下两个操作: 1.数组前缀和的查询: 2. ...

  4. 数据结构—2-3树、2-3-4树、B树、B+树等多路查找树的原理详解

    详细介绍了多路查找树中的2-3树.2-3-4树.B树.B+树的概念的区别,以及它们的应用场景. 文章目录 1 多路查找树的概述 1.1 索引概述 1.2 多路查找树的引出 2 2-3树 2.1 2-3 ...

  5. 【图解数据结构】树和二叉树全面总结(上)

    目录 一.前言 二.树的概念和定义 三.二叉树 1.基本概念 2.基本形态 3.性质 4.满二叉树 5.完全二叉树 四.存储结构 1.顺序存储 2.二叉链表 3.三叉链表 一.前言 学习目标:理解树和 ...

  6. 【数据结构】初入数据结构的树(Tree)以及Java代码实现(一)

    初入数据结构的树(Tree)以及Java代码实现(一) 树的定义 为什么叫树? 树型结构的元素具有一对多关系 树的定义 树的一些基本概念 树的结点 后代,祖先 子树.空树 树的度与高(深度),结点的度 ...

  7. python树结构_数据结构的树存储结构

    之前介绍的所有的数据结构都是线性存储结构.本章所介绍的树结构是一种非线性存储结构,存储的是具有"一对多"关系的数据元素的集合. (A)                       ...

  8. 数据结构树的基本操作_《数据结构》树的基本操作.doc

    <数据结构>树的基本操作 实验四 课程名称:完成日期:姓名:学号:指导教师:实验名称:实验序号:实验成绩:一.实验目的及要求 二.实验环境.实验内容 求出它的深度. .调试过程及实验结果 ...

  9. 数据结构-王道-树和二叉树

    [top] 树和二叉树 树:是\(N(N\geq0)\)个结点的有限集合,\(N=0\)时,称为空树,这是一种特殊情况.在任意一棵非空树中应满足: 有且仅有一个特定的称为根的结点. 当\(N>1 ...

  10. (八)数据结构之“树”

    数据结构之"树" 树是什么? 什么是深度/广度优先遍历? 深度优先遍历算法口诀 广度优先遍历算法口诀 二叉树的先中后序遍历 二叉树是什么 先序遍历算法口诀(根 > 左 > ...

最新文章

  1. JavaScript中变量的相互引用
  2. c语言元素插入数组并排序,一数组按顺序序存放,插入一个数,按原来排序规律放在相应位置...
  3. zabbix模板_基于zabbix网页配置自定义tomcat监控模板--监控项、触发器
  4. 华为徐直军:今年超3亿设备搭载鸿蒙系统
  5. OpenGLES渲染
  6. [20190226]测试使用bbed恢复索引.txt
  7. java解析字符串_java 拼接字符和解析字符串
  8. sonar下载安装配置教程
  9. 利用halcon的深度学习网络进行目标检测
  10. 可编程渲染管线(SRP)_学习笔记
  11. 一个迅雷480M,是搞笑的吗?
  12. 华为机试4.20:新员工考试
  13. oracle的报表工具有哪些,报表开发常用的六款小工具
  14. EasyWeChat生成小程序码
  15. 机器视觉系统——照明
  16. 正态性检验ks和sw区别_t检验常见问题汇总解答,你想知道的都在这里
  17. 2022秋季C语言专题实验03-一维数组
  18. 网络1711班 C语言第一次作业批改总结
  19. c语言数据类型习题,C语言-数据类型习题及答案.doc
  20. 项目管理-会议运作机制

热门文章

  1. MMDetection-简介
  2. Linux系统CUDA10.2+CUDNN安装教程
  3. 三年级人教版下学期计算机教案,人教版三年级下册信息技术教案
  4. 行健设计_广西大学行健文理学院参加2019年第七届广西大学生工业设计大赛
  5. Rust学习资料大全
  6. 在Android中使用FlatBuffers - 简介
  7. C++ 类和对象(三):构造函数补充、匿名对象、友元、内部类、类的static与const
  8. 中秋干货 | 架构进阶之路上的实时数仓
  9. 读者吐槽:Go 面试总被问到 RPC
  10. 惊!空 struct 地址竟然不相等