数据结构(三十九)多路查找树(B树)

  一、多路查找树的背景

  前面所讨论的查找算法都是在内存中进行的,它们适用于较小的文件,而对于较大的、存放在外存储器上的文件就不合适了,对于此类大规模的文件,即使是采用了平衡二叉树,在查找效率上仍然较低。

  如果要操作的数据集非常大,大到内存已经没办法处理了,这种情况下,对数据的处理需要不断从硬盘等存储设备中调入或调出内存页面。一旦涉及到这样的外部设备,关于时间复杂度的计算就会发生变化,访问该集合元素的时间已经不仅仅是寻找该元素所需比较次数的函数,必须考虑对硬盘等外部存储设备的访问时间以及将会对该设备做出多少次的单独访问。

  二、多路查找树的定义

  之前的树都是一个结点可以有多个孩子,但是它自身只存储一个元素,二叉树限制更多,结点最多只能有两个孩子。一个结点只能存储一个元素,在元素非常多的时候,就使得要么树的度非常大(结点拥有子树的个数的最大值),要么树的高度非常大,甚至两者都必须足够大才行。这就使得内存存取外存次数非常多,这显然成了时间效率上的瓶颈,因此,需要打破每一个结点只存储一个元素的限制。

  多路查找树(muiti-way search tree),其每一个结点的孩子树可以多于两个,且每一个结点处可以存储多个元素。

  三、2-3树  

  2-3树的定义:

  • 其中的每一个结点都有两个孩子(2结点)或三个孩子(3结点)。
  • 一个2结点包含一个元素和两个孩子(或没有孩子),且与二叉排序树类似,左子树包含的元素小于该元素,右子树包含的元素大于该元素。不过,与二叉排序树不同的是,这个2结点要么没有孩子,要有就有两个,不能只有一个孩子。
  • 一个3结点包含一小一大两个元素和三个孩子(或没有孩子),一个3结点要么没有孩子,要么具有3个孩子。如果某个3结点有孩子的话,左子树包含小于较小元素的元素,右子树包含大于较大元素的元素,中间子树包含介于两元素之间的元素。
  • 2-3树中所有叶子都在同一层次上。

  

  四、2-3-4树

  2-3-4树就是2-3树的拓展,包括了4结点的使用。一个4结点包含小中大三个数据元素和四个孩子(或没有孩子),一个4结点要么没有孩子,要么有4个孩子。如果某个4结点有孩子的话,左子树包含小于最小元素的元素;第二子树包含大于最小元素,小于第二元素的元素;第三子树包含大于第二元素,小于最大元素的元素;右子树包含大于最大元素的元素。

  2-3-4树的插入过程(插入顺序为{7,1,2,5,6,9,8,4,3}):

  

  2-3-4树的删除过程(删除顺序为:{1,6,3,4,5,2,9}):

  

  五、B树

  B树(B-Tree)是一种平衡的多路查找树,2-3树和2-3-4树都是B树的特例。结点最大的孩子数目称为B树的阶(order),因此,2-3树是3阶B树,2-3-4树是4阶B树。

  一个m阶的B树具有如下属性:

  • 如果根结点不是叶结点,则其至少有两个子树
  • 每一个非根的分支结点都有k-1个元素和k个孩子,其中【m/2】≤k≤m。每一个叶子结点n都有k-1个元素,其中【m/2】≤k≤m。
  • 所有叶子结点都位于同一层次
  • 所有分支结点包含下列信息数据(n,A0,K1,A1,K2,A2,...,Kn,An),其中:Ki(i=1,2,...,n)为关键字,且Ki<Ki+1(i=1,2,...n-1);Ai(i=0,1,2,...n)为指向子树根结点的指针,且指针Ai-1所指子树中所有结点的关键字均小于Ki(i=1,2,...,n),An所指子树中所有结点的关键字均大于Kn,n(【m/2】- 1≤ n ≤m - 1)为关键字的个数(或n+1为子树的个数)。

  

  六、B+树

  B树还是有缺陷的,对于树结构来说,可以通过中序遍历来顺序查找树中的元素,这一切都是在内存中进行。但是在B树中,往返于每个结点就意味着,必须得在硬盘的页面之间进行多次访问,例如,遍历下面这棵B树,假设每个结点都属于硬盘的不同页面,中序遍历所有元素就需要访问:页面2→页面1→页面3→页面1→页面4→页面1→页面5。即每次经过结点遍历时,都会对结点中的元素进行一次遍历,如何让遍历时每个元素只访问一次就成了需要解决的问题。

  

  B+树是在原有的B树结构基础上,加上了新的元素组织方式。B+树是应文件系统所需而出的一种B树的变形树,在B树中,每一个元素在该树中只出现一次,有可能在叶子结点上,也有可能在分支结点上。而在B+树中,出现在分支结点中的元素会被当做它们在该分支结点位置的中序后继者(叶子结点)中再次列出。另外,每一个叶子节点都会保存一个指向后一叶子结点的指针。

  

  一棵m阶的B+树和m阶的B树的差异在于:

  • 有n棵子树的节点中包含有n个关键字
  • 所有的叶子结点包含全部关键字的信息,即指向含这些挂念自记录的指针,叶子结点本身按照关键字的大小自小到大顺序链接
  • 所有分支结点可以看成索引,结点中仅含有其子树中的最大(或最小)关键字。

原文地址:https://www.cnblogs.com/BigJunOba/p/9288150.html

时间: 2024-10-03 15:02:55

数据结构(三十九)多路查找树(B树)的相关文章

QT开发(三十九)——GraphicsView框架

QT开发(三十九)--GraphicsView框架 本文主要翻译自QT 5.6.2GraphicsView官方文档 一.GraphicsView框架简介 QT4.2开始引入了Graphics View框架用来取代QT3中的Canvas模块,并作出了改进,Graphics View框架实现了模型-视图结构的图形管理,能对大量图元进行管理,支持碰撞检测,坐标变换和图元组等多种方便的功能. GraphicsView框架结构主要包含三个主要的类QGraphicsScene(场景).QGraphicsVi

19. 蛤蟆的数据结构进阶十九外部排序相关概念

19. 蛤蟆的数据结构进阶十九外部排序相关概念 本篇名言:"一个人最怕不老实,青年人最可贵的是老实作风. "老实 " 就是不自欺欺人,做到不欺骗人家容易,不欺骗自己最难. "老实作风 " 就是脚踏实地,不占便宜.世界上没有便宜的事,谁想占便宜水就会吃亏. --徐特立" 之前我们学习的排序都是内部排序的,接下去来看下外部排序. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47

centos shell编程5LANMP一键安装脚本 第三十九节课

centos shell编程5LANMP一键安装脚本  第三十九节课 上半节课 下半节课 f

程序员的奋斗史(三十九)——大学断代史(三)——我和知乎邂逅

遥望2011年的某个惶惶岁月,那是我与知乎相识的日子. 排除知乎网站的内测用户,我应该算得上第一批用户.那时知乎网还未开放注册,只能通过好友邀请注册,我费了九牛二虎之力,申请了好几次,才拥有了知乎账号.作为一个真实的问答社区,从近几年的运营来看,知乎是成功的.虽然外界曾质疑知乎网站的盈利模式,但不可否认知乎是伟大的. 众所周知,知乎的原型是国外的Quora.以前一直以为Quora是多么的神圣,直到今年注册并使用后,才发觉知乎在用户体验上一点不逊色于Quora.好的网站当如知乎,简洁美观.操作简便

NeHe OpenGL教程 第三十九课:物理模拟

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第三十九课:物理模拟 物理模拟简介: 还记得高中的物理吧,直线运动,自由落体运动,弹簧.在这一课里,我们将创造这一切. 物理模拟介绍 如果你很熟悉物理规律,并且想实现它,这篇文章很适合你. 在这篇教程里,你会创建一个非常简单的物理引

三十九、git add详解

一.前言git add命令主要用于把我们要提交的文件的信息添加到索引库中.当我们使用git commit时,git将依据索引库中的内容来进行文件的提交.二.基本git add <path>表示 add to index only files created or modified and not those deleted 我通常是通过git add <path>的形式把我们<path>添加到索引库中,<path>可以是文件也可以是目录.git不仅能判断出&

Python进阶(三十九)-数据可视化の使用matplotlib进行绘图分析数据

Python进阶(三十九)-数据可视化の使用matplotlib进行绘图分析数据 ??matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中. ??它的文档相当完备,并且 Gallery页面 中有上百幅缩略图,打开之后都有源程序.因此如果你需要绘制某种类型的图,只需要在这个页面中浏览/复制/粘贴一下,基本上都能搞定. ??在Linux下比较著名的数据图工具还有gnuplot

CCNA实验三十九 再临无线现场 &nbsp;

CCNA实验三十九 再临无线现场 环境:Windows XP  . PacketTracert 5.3 目的: 再次加深对无线模块化使用的理解,还有掌握无线局域网中的WEP.WPA.WPA-PSK加密,了解如何使用加密保护无线网络. 步骤: 创建拓扑如下: 1.分别为三台无线设备添加无线网卡: 2.分别为三台路由器添加无线模块: 3.配置AAA服务器: 4.配置R1路由器: Router>en Router#conf t Router(config)#host R1 R1(config)#ip

ActionScript3游戏中的图像编程(连载三十九)

2.3.1 用方块观察斜面样式与斜角滤镜作用方法的差异 在Photoshop和Flash里都各自建一个500*500的空白文件,然后各自在画布中心画上一个纯蓝的(#0000FF),100*100大小的方块,(如果不懂得如何完成以上操作,可自行翻阅相关的入门教材)然后Flash里再多做一步,按F8转换为元件,类型选择"影片剪辑". 为了最大程度上减少对本课题研究的干扰,我们创建的投影力求做到最简单,最干净.为此,我把Flash里的投影滤镜中的模糊设置成0,并且把颜色调亮(#00cc00)

微信小程序把玩(三十九)navigation API

原文:微信小程序把玩(三十九)navigation API 演示效果也看到了小程序也就提供这几个处理导航控制.值得注意的是只能同时导航五个页面 主要属性: 导航条一些方法 wx.setNavigationBarTitle(object) 设置导航条的Title 导航标题可以通过三种方式设置,第一种是通过全局配置名字统一,第二种就是在page中新建个json文件配置它会覆盖全局配置的title,第三种就是通过API设置. wx.showNavigationBarLoading()设置在导航条上显示