叶子结点

B树和B+树的插入、删除图文详解

有些话、适合烂在心里 提交于 2020-02-19 10:54:58
简介:本文主要介绍了B树和B+树的插入、删除操作。写这篇博客的目的是发现没有相关博客以举例的方式详细介绍B+树的相关操作,由于自身对某些细节也感到很迷惑,通过查阅相关资料,对B+树的操作有所顿悟,写下这篇博客以做记录。由于是自身对B+树的理解,肯定有考虑不周的情况,或者理解错误的地方,请留言指出。 1. B树 1. B树的定义 B树也称B-树,它是一颗多路平衡查找树。我们描述一颗B树时需要指定它的阶数,阶数表示了一个结点最多有多少个孩子结点,一般用字母m表示阶数。当m取2时,就是我们常见的二叉搜索树。 一颗m阶的B树定义如下: 1)每个结点最多有m-1个关键字。 2)根结点最少可以只有1个关键字。 3)非根结点至少有Math.ceil(m/2)-1个关键字。 4)每个结点中的关键字都按照从小到大的顺序排列,每个关键字的左子树中的所有关键字都小于它,而右子树中的所有关键字都大于它。 5)所有叶子结点都位于同一层,或者说根结点到每个叶子结点的长度都相同。 上图是一颗阶数为4的B树。在实际应用中的B树的阶数m都非常大(通常大于100),所以即使存储大量的数据,B树的高度仍然比较小。每个结点中存储了关键字(key)和关键字对应的数据(data),以及孩子结点的指针。 我们将一个key和其对应的data称为一个记录 。 但为了方便描述,除非特别说明,后续文中就用key来代替(key,

查找——二叉排序树

陌路散爱 提交于 2020-02-17 20:08:49
二叉排序树(Binary Sort Tree),又称为二叉查找树,它具备以下性质,若它的左子树不为空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不为空,则右子树上所有结点的值均大于它的根结点的值;它的左右子树也分别为二叉排序树。 1、二叉排序树的查找操作 递归查找二叉排序树T中是否存在key,指针f指向T的双亲,其初始调用值为NULL,若查找成功,则指针p指向该数据元素结点,并返回TRUE,否则指针p指向查找路径上访问的最后一个结点并返回FALSE。 2、二叉排序树的删除操作 找到key元素的结点并进入Delete函数删除该结点,删除结点三种情况进行分析:叶子结点;仅有左或右子树结点,左右子树都有结点。在实际操作中,通过递归找到删除的结点p: 若右子树为空,只需将该结点的左子树重接上去,该结点删除free; 若左子树为空,只需将该结点的右子树重接上去,该结点删除free; 若左右子树都不为空,找到删除结点*p的左孩子的最右结点s,将删除结点*p的左孩子的最右结点s的值替代删除结点*p的值,第一种情况是删除结点*p的左孩子有右子树,因为删除结点*p的左孩子的最右结点s的值替代删除结点*p的值,那么s->L替代s结点,所以q->R=s->L;第二种情况是删除结点*p的左孩子没有右子树,q就是*p要删除的结点,所以q->L = s->L,最后free结点s 3

B树及代码实现(c++)

泄露秘密 提交于 2020-02-16 19:16:35
这里推荐一篇图文并茂的好文章, B树、B+树、B*树 这里我实现代码过于粗糙,应该有很多地方可以改进, 另外我并没有实现b+树以及b*树,但其实应该也不复杂,无非是在struct增加指向兄弟结点的指针,应该也容易实现: /* * B 树 * */ # include "iostream" # include "vector" # include <cstring> # include <typeinfo> # include <cmath> # include <algorithm> using namespace std ; //#define DEGREE 6; const int DEGREE = 4 ; int maxD = DEGREE - 1 ; int minD = ( int ) std :: ceil ( DEGREE / 2. ) - 1 ; /* NOLINT */ template < class T > int getArrayLen ( T & array ) { //使用模板定义一 个函数getArrayLen,该函数将返回数组array的长度 return ( sizeof ( array ) / sizeof ( array [ 0 ] ) ) ; } // TODO: 用预值,定义data数组 typedef struct BTnode { //

SIFT关键点描述符

大憨熊 提交于 2020-02-16 14:38:02
尺度不变特征变换(关键点描述符)第四部分详解 构建描述符步骤:①将坐标轴移动到关键点主方向的位置,实现随着尺度的变化特征点不变的性能。 ②将关键点周围邻域分为4 4,16个子邻域,子邻域包含多个像素点。 ③进行三线插值,记录每个子邻域内像素点在8个方向的梯度直方图,表示8个数值,总计128个数值,从小到大依次排列,构成128维向量,向量归一化处理,消除光照等影响 ④运用KNN算法将两幅图像的相同关键点匹配操作。 算法 三线性插值:关键点邻域大小R=m sigma*((d+1)/2)*sqrt(2),m=3,sigma为关键点所在高斯金字塔的尺寸,d=4,表示邻域边分为小区域的个数。 x’y’表示旋转之后的点坐标,角度为主方向角度。 新的局部坐标系下的点的坐标。 a b为点的全局坐标,m表示梯度值,对圆形区域内的点进行高斯加权。 红点周围小四方蓝色区域的四个顶点分别在周围四个绿色区域的中心。 若x’’ y’‘距离第0行和第2列的距离为dr、dc,那么x’’ y’'相距绿色中点的距离从上到小左到右距离为(dr,dc),(dr,1-dc)(1-dr,dc)(1-dr,1-dc)。 根据权重与距离成反比原则,则四个位置的权重分别为 W*(1-dr) (1-dc)、W (1-dr) (dc)、W (dr) (1-dc)、W (1-dr)*(1-dc) 将该点的值按照权重分为不同方向

C语言学习————树的学习

你离开我真会死。 提交于 2020-02-16 11:59:11
这周我学习了树的有关知识,将学到的一些东西写下来。 FIRSt 树的定义 1、有且只有一个称为根的节点; 2、有若干个互不相交的子树,这些子树本身也是一颗树。 SECOND 专业术语 树的深度:从根节点到最低层,节点的层数 ,称之为树的深度。 根节点是第一层; 结点的层次:根节点为第一层,根节点的子节点为第2层,以此类推 ; 叶子节点:没有子节点的节点; 非终端节点:实际就是非叶子节点; 结点度: 子节点的个数称为度树的度。 THIRD 树的分类 一般树:任意一个节点的子节点的个数不受限制; 二叉树:任意一个节点的子节点最多2个,且子节点的位置不可更改; 满二叉树:在不增加层数的情况下,不能在增加节点的情况就是满二叉树; 完全二叉树:若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。 介绍完树的基础知识后,我参考网上大神的代码,自己试了试二叉树的C语言建立与打印,代码如下: 二叉树的建立、插入与打印 # include <stdio.h> # include <stdlib.h> //二叉树的结点 typedef struct tree { struct tree * left ; struct tree * right ; int data ; } treenode , * Tree

错题本——数据结构(树)

不羁的心 提交于 2020-02-15 08:24:41
树 在任意一棵非空二叉排序树T1中, 删除某结点v之后形成二叉排序树 T2,再将v 插入T2形成二叉排序树T3。下列关于T1与T3的叙述中,正确的是( )。 I.若 v 是 T1的叶结点,则 T1 与 T3 不同 II. 若 v 是 T1的叶结点,则 T1与 T3相同 III.若 v 不是 T1 的叶结点,则 T1 与 T3 不同 IV.若v 不是 T1 的叶结点,则 T1 与 T3 相同 解析: 以下说法正确的是( )。 A 若有一个结点是二叉树中某个子树的中序遍历结果序列的最后一个结点,则它一定是该子树的前序遍历结果序列的最后一个结点。 B 若有一个结点是二叉树中某个子树的前序遍历结果序列的最后一个结点,则它一定是该子树的中序遍历结果序列的最后一个结点。 C 若有一个页子结点是二叉树中某个子树的中序遍历结果序列的最后一个结点,则它一定是该子树的前序遍历结果序列的最后一个结点。 D 若有一个页子结点是二叉树中某个子树的前序遍历结果序列的最后一个结点,则它一定是该子树的中序遍历结果序列的最后一个结点。 解析: A:中序遍历结果为AB,前序遍历结果为BA,因此错误 B:前序遍历结果为BA,中序遍历结果为AB,因此错误 C:中序遍历的情况下,固定了叶子结点为最后一个结点,因此一定有右子树,中序遍历和前序遍历的顺序都是将右子树放在最后一个,因此C正确 D:前序遍历的情况下

错题本——数据结构(堆)

穿精又带淫゛_ 提交于 2020-02-15 05:38:11
堆 下标从1开始,在含有n个关键字的小根堆(堆顶元素最小)中,关键字最大的记录有可能存储在( )的位置上 A [n/2] B [n/2]-1 C 1 D [n/2]+2 解析: 小根堆中最大的数一定是放在叶子节点上,堆本身是个完全二叉树,完全二叉树的叶子节点的位置大于 [ n / 2 ] [n/2] [ n / 2 ] 补充: 完全二叉树的顺序结构 对于一个完全二叉树,假设它有n个结点,对结点进行从1开始编号,对任一结点 i 满足下面: 它的双亲是结点 i/2 (除了i=1的情况) 左孩子是 2i 右孩子是 2i+1 如果2i>n 说明无左孩子 2i+1>n 说明无右孩子 如. 来源: CSDN 作者: 白羊_Aries 链接: https://blog.csdn.net/qq_38204302/article/details/104311184

数据结构-树与二叉树

谁说胖子不能爱 提交于 2020-02-14 15:31:50
一、树的定义与性质 <1>定义 结点(node):树枝分叉处、树叶、树根 根结点(root):树根 叶子结点(leaf):叶子结点 边(edge):茎干和树枝 子结点(child) 子树(subtree) <2>性质 树可以没有结点,把这种情况下称为空树(empty tree) 树的层次(layer),从根结点开始算起来,即根结点为第一层 把结点的子树棵树称为结点的度(degree),而树的中结点的最大的度称为树的度(也称为树的宽度) 对于有n个结点的树的边一定是n-1 叶子结点被定义为0的结点,因此当树只有一个结点时,根结点也算作叶子结点 结点的深度(depth)是指从根结点(深度为1),开始自顶向下逐层累加至该结点时的深度值;而高度(height)是指从最底层叶子结点开始自底向上逐层累加,而对于树而言,是选择最大的那个数,同时,深度和高度应该是一样的。 多棵树结合在一起就是森林(forest) <3>二叉树的递归定义 要么二叉树没有根结点,是一棵空树。 要么二叉树由根结点、左子树、右子树组成,且左子树和有子树都是二叉树。 区分二叉树和度为2的树 满二叉树:每一层结点个数都达到当层能够达到的最大结点数。 完全二叉树:除了最下面一层之外,其余层的结点个数都达到当层的最大结点数,且最下面一层只从左到右连续存在若干结点,而这些连续结点右边的结点全部不存在。 自己即是自己的祖先结点

从原理到优化,深入浅出数据库索引

半世苍凉 提交于 2020-02-13 23:44:06
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。 数据库查询是数据库的最主要功能之一,我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化,这篇文章对索引做一个系统的梳理,希望对大家有帮助。 一、MySQL有哪些索引类型 索引的分类可以从多个角度进行,下面分别从数据结构,物理存储和业务逻辑三个维度进行划分。 1、从数据结构角度 (1)B+树索引(O(log(n))) 关于B+树索引,后面会深入解析 (2)hash索引 仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询 其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引 只有Memory存储引擎显示支持hash索引 (3)FULLTEXT索引 现在MyISAM和InnoDB引擎都支持了 (4)R-Tree索引 用于对GIS数据类型创建SPATIAL索引 2、从物理存储角度 (1)聚集索引(clustered index) 正文内容按照一个特定维度排序存储,这个特定的维度就是聚集索引; Innodb存储引擎中行记录就是按照聚集索引维度顺序存储的,Innodb的表也称为索引表;因为行记录只能按照一个维度进行排序

决策树算法

Deadly 提交于 2020-02-13 00:50:10
本文的结构如下: 决策树构造实例:这个就不详细讲了,大家知道树的结构就行了 ID3:信息增益(有什么问题呢?) C4.5:信息增益率(解决ID3问题,考虑自身熵情况) CART:使用GINI系数来当作衡量标准 决策树的剪枝:预剪枝,后剪枝 文章目录 1. 衡量标准(信息论基础) 2. ID3算法 3. C4.5算法 4. 分类回归树(Classification and Regression Tree, CART) 5. 剪枝 预剪枝 后剪枝 1. 衡量标准(信息论基础) 单一变量的熵—— 多个变量的联合熵—— 条件熵—— 互信息—— I(X,Y) = H(X)-H(X|Y) 如果说H(X)度量了X的不确定性,条件熵H(X|Y)度量了我们在知道Y以后X剩下的不确定性,那么互信息就是度量了X在知道Y以后不确定性减少程度,记为I(X,Y)。 最后用一张图描述四者的关系: 2. ID3算法 在决策树的ID3算法中,互信息I(X,Y)被称为 信息增益 。ID3算法就是用信息增益来判断当前节点应该用什么特征来构建决策树。信息增益大,则越适合用来分类。 分别对各个属性 递归 地计算信息增益,取最大的子节点的分裂属性,最终就可以得到整个决策树。 但是ID3算法中还存在着一些不足之处: ID3没有考虑 连续特征 ,比如长度,密度都是连续值,无法在ID3运用。这大大限制了ID3的用途。