树与存储

二叉树:

一个根节点,每个节点下挂着最多2个子节点。、

概念:

度:结点的分支数,二叉树度为2。

深度:树的层次。

二叉排序树:

二叉树的基础上,每个节点上都有一个数字,节点上的数字都比右节点上的大。

应用场景:

基于内存的排序数据结构,写入时将数据写入到对应的位置。数据可能会出现倾斜,可以想到数字写入顺序如果不是50-20-60-18-55,而是18-20-50-55-60,那么二叉树就会退变为链表。

B-树:

B-树每个节点上包含着数据和指针,每个指针指向其一个子节点的位置,并且数据的个数为指针的2d-1个。这里的d是指针的个数,同时也是树的“度”。

B-树的查找需要一次对每个节点进行二分查找,直至找到或返回null。通常,可以引入布朗过滤器等方式加速查找。

B-树的写入、删除时要进行分裂、合并、转移等操作,越是非顺序的插入就越容易碰到这些高性能消耗的操作。

应用场景:

一般B-树常常作为磁盘的查找的数据结构使用。

一般磁盘为了减少寻道时间,往往会进行预读,一次读入1个或多个page的数据。我们只要将B-树的每个节点控制在一个page大小,就可以保证,磁盘一次的查找只需要一次IO。一个page大小一般在4k,可以存储不少的数据,假设一个节点存储数据量为100,深度为3的B-树,即可保存100w数据量(100*100*100),而100的数据一般用不了4k的存储空间。

当然,这里节点中存储的东西主要包括data和指针,指针大小是固定的,而数据有大有小。只要控制好每个数据块的大小,就可以提高B-树的性能。

另外,一般情况下非叶子节点占用空间一般较小,上面的例子中,非叶子节点数据量只有1w,完全可以缓存至内存中,这点也是在实际数据库实现中常常使用到的优化。

B+树:

B+树完全是对B-树的工程级优化,非叶子节点不在存储data,只有根节点才存储数据。最大程度的加大了单个page中指针的个数,增加数的度。减少了树的层次。

另外相比较于B-树,其key的个数变为指针个数的2d个。

应用场景:

实际在数据库系统中使用时,往往每个叶子节点都会存储一个其相邻节点的一个指针,用来在范围查找时有更好的性能。

时间: 2024-10-19 06:08:58

树与存储的相关文章

hibernate —— 树状存储

1 package com.pt.treeStrut; 2 3 import java.util.Set; 4 5 import javax.persistence.CascadeType; 6 import javax.persistence.Entity; 7 import javax.persistence.GeneratedValue; 8 import javax.persistence.Id; 9 import javax.persistence.JoinColumn; 10 imp

10.树与树的存储结构

一.树 1.树的定义:树是n(n>=0)个结点的有限集,其中n=0时称为空树.在任意一颗非空树中:(1)有且仅有一个特定的称为根的结点;(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1.T2.....Tm,其中每一个集合本身又是一棵树,并且称为根的子树(Subtree). 注意:当m>0时,子树的个数没有限制,但它们一定是互不相交的. 2.结点的度与树的度 树的结点包含一个数据元素及若干指向其子树的分支. (1)结点的度:结点拥有的子树称为结点的度(degree)

Java数据结构-树及树的存储结构

树的定义:n(n>=0)个节点的有限集. n=0时称为空树. n!=0时为非空树,有且仅有一个特定的节点--根:n>1时,其它节点可以分为m(m>0)个互不相交的有限集T1~Tm,其中每一个集合本身又是一棵树,并且称为根的子树. 树的一些基本术语: 树的结点:由一个数据元素和若干个指向其子树的分支组成. 结点的度:结点所拥有的子树的个数(即分支数)称为该结点的度. 叶子结点:度为0的结点称为叶子结点,或者称为终端结点. 分支结点:度不为0的结点称为分支结点,或者称为非终端结点.一棵树的结

树的存储

树的存储方式 //树的双亲表示 typedef struct{ //节点结构 ElemType data; //元素 int parent; //双亲位置 }PTNode; typedef struct{ //树 PTNode nodes[Max]; int n; //树的节点个数 }PTree; //孩子表示法 typedef struct{ //孩子结点 int child; //孩子位置 struct CNode* next; }CNode; typedef struct{ ElemTyp

树以及树的存储结构

//树的存储结构 //双亲存储结构 typedef struct { int data;//结点的值 int parent;//指向双亲位置的伪指针 } PTree[maxsize]; //孩子存储结构 typedef struct node { int data;//结点的值 struct node *sons[maxsize];//指向孩子结点 }TSonNode; //孩子兄弟链存储结构 typedef struct tnode { int data; struct tnode *hp;/

数据结构(四)树---树的存储结构

前提 树中的某个结点的孩子可以有多个,所以仅仅使用简单的顺序结构或者链式结构是不能完全表示一整棵树的. 充分利用顺序存储结构和链式存储结构的特点,完全可以实现对树的存储结构的表示 我们表示一棵树的方法有:双亲表示法,孩子表示法,孩子兄弟表示法 补充 对于双亲表示法:我们先将双亲结点存入,我们每插入一个结点都是知道双亲结点位置的,数据可以直接插入.使用顺序存储结构更加方便 而对于孩子表示法,我们每次插入一个结点,对其子树的位置存放暂不确定,所有使用链式存储结构占主要 (一)双亲表示法 以双亲作为索

树的存储、森林的存储

树的存储: 二叉树的存储: 1.  连续存储(顺序存储)[完全二叉树],以数组实现 优点: 查找某个节点的父节点和子节点(包括判断有没有子节点和父节点) 缺点: 耗用内存空间过大 2.  链式存储: 一个节点包含三个部分:左子节点地址.数据域.右子节点地址 优点:耗内存小 一般树的存储: 由于计算机的内存是线性的,而树是非线性的.若在计算机里只存树的有效节点,便不能查找某个节点的子节点和父节点(或者说整个树的逻辑存储无法知晓),所以必须要先转化成完全二叉树,把垃圾节点补上. 绿色的是普通树,蓝色

树的存储结构以及遍历

一.树的存储结构 ——————顺序存储(一维数组)—————— 1.双亲表示法: 1 #define MaxSize 100 //假设树中最多有100个节点 2 //1.定义树节点的数据类型,假设为char型 3 typedef char DataType; 4 typedef struct{ 5 DataType data; //树节点的数据信息 6 int parent; //该节点的双亲在数组中的下标 7 }PNode; 8 //2.定义双亲表示法存储结构 9 typedef struct

左右值编码实现树状存储

聊聊树状结构如何在数据库中存储 昨天有人在QQ小组问起,无限分层的树状结构,数据量比较大,在一万条以上,如何设计数据库的结构.其实这是个老生常谈的问题,一般的做法是有一个pid字段,为了提高效率,还会有个FullPath字段.(一些人还设置一个层级字段,但我不知道这个字段有何作用),FullPath字段可以用id-id-id-.这种方式拼字符串存储,这样可以方便地用 like 语句进行查询某个节点及其子节点. 曾经看到过另外一种存储方式,利用了一般树结构可以转换二叉树的这一做法,用二叉树进行存储