B树,B-树,B+树和B*树
B树和B-树(平衡多路查找树)
规则:
1、排序方法:所有结点关键字按递增次序,并遵循左小右大的原则。
2、子结点数:非叶子结点的子结点数>1且<=M且M>=2,空树除外(M阶代表一个树的结点最多有M路查找路径)
3、关键字数:中间结点关键字数量大于等于ceil(M/2)-1且小于等于M-1个
4、所有叶子结点均在同一层,叶子结点除了包含了关键字和关键字记录的指针外,也有指向其叶子结点的指针,只不过指针地址都是NULL.
特点:B树相对于平衡二叉树不同是每个结点包含的关键字增多了,特别是这B树应用到数据库中的时候,充分的利用了磁盘块的原理(磁盘块数据存储是采用块的形式存储的,每次IO读取时,同一磁盘的数据可以一次读出)把结点大小限制和充分使用在磁盘块的大小范围内,把树的结点关键字增多后,树的层级比原来的二叉树少了,减少数据查找的次数和复杂度。
B+树
B+树是B树的一个升级版,相对于B树来说,B+树更充分利用了结点的空间,让查询速度稳定,其速度完全接近于二分查找。
规则:
1、B+树和B树不同,B+树的非叶子结点不保存关键字记录指针,只进行数据索引,这样使得B+树每个结点可以保存的关键字大大增加
2、 B+树的叶子结点保存了父节点的所有关键字记录的指针,所有数据地址必须要到叶子结点才能获取到,所以每次查询的次数都是一致的
3、B+树叶子结点的关键字从小到大有序排列,左边结尾数据都会保存右边结点开始数据的指针
4、非叶子结点的子结点数=关键字数(根据多种资料,这里有两种算法的实现方法,另一种为非叶子结点的关键字数=子结点数-1)
特点:
1、B+树的层级更少,相较于B树,B+树每个非叶子结点存储的关键字数更多,树的层级更少,所以查询数据速度更快
2、B+树查询速度更稳定,B+树所有关键字数据都存在叶子结点上,所以每次查找速度比B树更加稳定
B*树
B*树是B+树的变种
规则:
1、关键字个数限制,B+树初始化个数为cei(m/2)B*树初始化个数为cei(2/3)
2、B+树结点满了时候就会分裂,而B*树会检查兄弟结点是否为满(因为每个结点都有指向兄弟的指针),如果兄弟未满则向兄弟转移关键字,如果兄弟已满,则从当前节点和兄弟结点各拿出1/3数据来创建一个新的结点
特点:
在B+树的基础上因初始化容量变大,使得结点空间利用率变高,而又存有兄弟结点转移关键字的特性,使得B*树的分解次数变少。
3、B+树天然具备排序功能,B+树的叶子结点构成了一个有序的链表,在查询大小区间的数据时候更方便,数据紧密性更高,缓存命中率也很高。
4、B+树全结点遍历更快,B+树遍历整棵树只要遍历所有叶子结点就可以了,不需要像B树一样需要遍历每一层,有利于数据库做全表扫描
B树,B-树,B+树和B*树的更多相关文章
- 【树状数组套权值线段树】bzoj1901 Zju2112 Dynamic Rankings
谁再管这玩意叫树状数组套主席树我跟谁急 明明就是树状数组的每个结点维护一棵动态开结点的权值线段树而已 好吧,其实只有一个指针,指向该结点的权值线段树的当前结点 每次查询之前,要让指针指向根结点 不同结 ...
- jquery: json树组数据输出到表格Dom树的处理方法
项目背景 项目中需要把表格重排显示 处理方法 思路主要是用历遍Json数组把json数据一个个append到5个表格里,还要给每个单元格绑定个单击弹出自定义对话框,表格分了单双行,第一行最后还要改ro ...
- 浅谈算法和数据结构: 七 二叉查找树 八 平衡查找树之2-3树 九 平衡查找树之红黑树 十 平衡查找树之B树
http://www.cnblogs.com/yangecnu/p/Introduce-Binary-Search-Tree.html 前文介绍了符号表的两种实现,无序链表和有序数组,无序链表在插入的 ...
- Qtree3题解(树链剖分(伪)+线段树+set)
外话:最近洛谷加了好多好题啊...原题入口 这题好像是SPOJ的题,挺不错的.看没有题解还是来一篇... 题意: 很明显吧.. 题解: 我的做法十分的暴力:树链剖分(伪)+线段树+\(set\)... ...
- 「ZJOI2017」树状数组(二维线段树)
「ZJOI2017」树状数组(二维线段树) 吉老师的题目真是难想... 代码中求的是 \(\sum_{i=l-1}^{r-1}a_i\),而实际求的是 \(\sum_{i=l}^{r}a_i\),所以 ...
- 敌兵布阵 HDU - 1166 (树状数组模板题,线段树模板题)
思路:就是树状数组的模板题,利用的就是单点更新和区间求和是树状数组的强项时间复杂度为m*log(n) 没想到自己以前把这道题当线段树的单点更新刷了. 树状数组: #include<iostrea ...
- BZOJ4860 BJOI2017 树的难题 点分治、线段树合并
传送门 只会线段树……关于单调队列的解法可以去看“重建计划”一题. 看到路径长度$\in [L,R]$考虑点分治.可以知道,在当前分治中心向其他点的路径中,始边(也就是分治中心到对应子树的根的那一条边 ...
- 树的最长链-POJ 1985 树的直径(最长链)+牛客小白月赛6-桃花
求树直径的方法在此转载一下大佬们的分析: 可以随便选择一个点开始进行bfs或者dfs,从而找到离该点最远的那个点(可以证明,离树上任意一点最远的点一定是树的某条直径的两端点之一:树的直径:树上的最长简 ...
- BZOJ2141排队——树状数组套权值线段树(带修改的主席树)
题目描述 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家 乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的身高有所区别 ...
- luogu3380/bzoj3196 二逼平衡树 (树状数组套权值线段树)
带修改区间K大值 这题有很多做法,我的做法是树状数组套权值线段树,修改查询的时候都是按着树状数组的规则找出那log(n)个线段树根,然后一起往下做 时空都是$O(nlog^2n)$的(如果离散化了的话 ...
随机推荐
- flutter系列之:如丝般顺滑的SliverAppBar
目录 简介 SliverAppBar详解 SliverAppBar的使用 总结 简介 对于一个APP来说,肯定会有一个AppBar,这个AppBar一般包含了APP的导航信息等.虽然我们可以用一个固定 ...
- Django测试脚本-单表操作(增删改查)-必知必会13条-神奇的双下划线
目录 一:Django测试脚本 1.测试环境准备 2.tests.py 3.models.py 4.切换MySQL数据库 二:单表操作 1.pk关键字与get关键字 2.增 3.删 4.修 三:必知必 ...
- vulnhub靶场之DARKHOLE: 1
准备: 攻击机:虚拟机kali.本机win10. 靶机:DarkHole: 1,下载地址:https://download.vulnhub.com/darkhole/DarkHole.zip,下载后直 ...
- JavaScript:原型(prototype)
面向对象有一个特征是继承,即重用某个已有类的代码,在其基础上建立新的类,而无需重新编写对应的属性和方法,继承之后拿来即用: 在其他的面向对象编程语言比如Java中,通常是指,子类继承父类的属性和方法: ...
- conan环境安装
环境 安装conan 使用conan 搜索包 导入包 编译 打包项目 准备源码 编译成conan包 环境 ubuntu:bionic的docker image docker run -it ubunt ...
- Window注册表的学习记录
注册表的结构: 概述:注册表是一种树状结构,在很早之前是系统的其他配置信息存放的文件,通常以.ini结尾的文件,因为数量太多不方便管理,后来就整合在一起形成了注册表.你可以按住键盘win+r,然后输入 ...
- 如何配置 SLO
前言 无论是对外提供 IaaS PaaS SaaS 的云公司,还是提供信息技术服务的乙方公司,亦或是金融 制造等各行各业的数据中心.运维部门,我们的一个非常重要的合同承诺或考核评估指标就是:SLA(即 ...
- linux配置本地yum源实现在局域网中在线安装软件包
安装linux下安装软件需要安装一系列的rpm包,用rpm -ivh xx和yum install xx 如果用rpm安装软件包的时候,需要自己下载rpm安装包,如果rpm包不全总是提示依赖检查失败或 ...
- Unix 系统数据文件那些事儿
前言 Unix like 系统和 windows 的最大区别就是有一套标准的系统信息数据文件,一般存放在 /etc/ 目录下,并且提供了一组近似的接口访问和查询信息,这些基础设施让系统管理看起来井井有 ...
- linux系统一键开启root登陆
服务器只能key登陆,用这个后直接可以root方式登陆 sudo -i echo root:要设置的密码 |sudo chpasswd root sudo sed -i 's/^#\?PermitRo ...