几种平衡树的总结

一、2-3-4树介绍

2-3-4树是一种多叉树(multiway tree),它的每个节点最多有四个子节点和3个数据项,2-3-4 树可以看做是阶为4 的B树。B树是另一种平衡的多叉树,专门用在外部存储中来组织数据(通常是指磁盘驱动器)。B树中的节点可以有几时或几百个。

2-3-4树名字中的2、3、4的含义是指一个节点可能含有的子节点数。

有1个数据项的节点总是有2个子节点

有2个数据项的节点总是有3个子节点

有3个数据项的节点总是有4个子节点

简言之,非叶子节点的子节点数总是比它含有的数据项多1

在2-3-4树中不允许一个节点只有一个链接,这与传统的二叉树不同。

二、B树、B+树

二叉树提供了良好的性能,但是当数据有序插入时会失去平衡,2-3-4树和2-3树是一种平衡树,是多路的,而红-黑树(见上一篇文章)是一种二叉平衡树,通过严格的红黑规则保持平衡。B树是一种平衡的多路查找树,可以看做一种扩展的2-3-4树,它的数据项个数和子节点数没有限制(如果结点的元素数量非常多的话那就退化成节点内部的线性查找了),在文件系统中有所应用,主要用作文件的索引。

B树插入节点要注意从子节点开始分裂,一直上溯到根

B+树是B树的一种变型

B+树中的非叶子节点不是最终指向文件内容的节点,而只是叶子节点中关键字的索引。所有的叶子节点包含了全部关键字的信息,且叶子节点本身依关键字自小而大顺序链接。所以任何关键字的查找都必须走一条从根节点到叶子节点的路(导致每一个数据的查询效率相当)。

总而言之,B 树在提高了磁盘IO 性能的同时并没有解决元素遍历效率低下的问题。正是为了解决这个问题,B+树应运而生。B+树只要遍历叶子节点就可以实现整棵树的遍历,支持基于范围的查询,而B树不支持range-query 这样的操作(或者说效率太低)。

通过以上介绍,大致将B 树,B+树,B*树总结如下:

● B 树:有序数组+平衡多叉树;

● B+树:有序数组链表+平衡多叉树;

● B*树:一棵丰满的B+树。

B树相关的参考资料http://blog.csdn.net/v_july_v/article/details/6530142

时间: 2024-08-02 06:23:46

几种平衡树的总结的相关文章

几种平衡树

1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #define ls(x) (x->ch[0]) 5 #define rs(x) (x->ch[1]) 6 #define sz(x) (x->size) 7 #define p(x) (x->p) 8 using namespace std; 9 const int INF=0x7fffffff; 10 struct so

各种平衡树Treap/SBT/Avl/Splay tree

看了这么久的平衡树,是时候做个总结了. 以poj 3481为例,敲了四份代码,分别是Treap ,Size Balance Tree,Avl Tree,splay tree. 唯独少了红黑树T_T... 总的来说每种平衡树各有各的优点吧: Treap写起来简单上手也快如果熟练的话不到十分种可以敲完. SBT速度快名不虚传... Avl树高度平衡吧,不过实际的效果不尽如人意,可能是我实现的姿势不对吧/(ㄒoㄒ)/~~ splay tree各方面比较均衡,特别的伸展树在维护序列方面相对其它几种树优势

子树大小平衡树

#include<cstdio> #define MXN 100000+3 #define max(a,b) (a>b?a:b) #define min(a,b) (a<b?a:b) #define nil 0 #define LEFT false #define RIGHT true int val[MXN],size[MXN],fa[MXN],left[MXN],right[MXN],recycle[1001],root; int ntop,rtop=-1,rcount; in

平衡树讲解(旋转treap,非旋转treap,splay)

在刷了许多道平衡树的题之后,对平衡树有了较为深入的理解,在这里和大家分享一下,希望对大家学习平衡树能有帮助. 平衡树有好多种,比如treap,splay,红黑树,STL中的set.在这里只介绍几种常用的:treap和splay(其中treap包括旋转treap和非旋转treap). 一.treap treap这个词是由tree和heap组合而成,意思是树上的的堆(其实就是字面意思啦qwq).treap可以说是由二叉搜索树(BST)进化而来,二叉搜索树每个点满足它左子树中所有点权值都比它小,它右子

平衡树代码总结

这里给出博主的几种平衡树模板代码 vector 代码: // luogu-judger-enable-o2 #include<bits/stdc++.h> #define rd(x) x=read() using namespace std; int n; vector<int>v; inline int read() { int f=1,x=0;char s=getchar(); while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar

平衡树之Splay

算法简介 Splay是一种平衡树,支持插入.删除.求排名.求第\(k\)大数.求前驱和求后继的操作,并且它还能做到一般平衡树做不到的区间操作. 定义与性质 先说二叉查找树:就是把所有数建在树上,且左边的数永远小于右边的. 对于上面说的那6个操作,其实在数据随机时二叉查找树时最强的,但是数据一条链你就Good Game了. 这种情况我们希望这棵二叉查找树的节点深度差不要太大,这就有了平衡树. 顾名思义,平衡树是平衡的二叉查找树,意思就是说1条链这种数据对于平衡树来说完全不存在,这样复杂度就有保证了

【codeforces85D】

去实验培训回来了--写个题先玩玩 这题给人一种平衡树的感觉 但是呢,实际上操作离线+离散化+线段树一样能做 #include<bits/stdc++.h> #define lson (o<<1) #define rson (o<<1|1) const int N=2e5+5; typedef long long ll; using namespace std; struct Opt{int tp,num;}op[N]; int n,a[N],cnt=0,tot=0; l

[数据结构]替罪羊树简介

替罪羊树是不通过旋转而是重构的一种平衡树.当某一棵子树的节点总数超过其父节点的一定时,就进行重构操作. 目录 节点定义 重构操作 插入操作 删除操作 其他各种操作 完整代码&总结 [节点定义] 为了判断是否需要重构,所以需要加入cover(实际节点个数)域.这次直接加入可重操作,所以还需要增加一个size域.为了体现C++面向对象的思想(分明就是Java用多了),所以判断一个子树是否需用重构写成成员函数bad().(真开心,因为是重构,不需要那么多的father,终于可以轻松地删掉父节点指针)

支持泛型AVL Tree的简单实现,并和STL map比较了插入,删除,查找的性能

1.问题描述: 1)AVL tree是一种自平衡树.它通过左右子树的高度差来控制树的平衡,当高度差是不大于1的时候,认为树是平衡的.树的平衡保证了树在极端情况下 (输入序列不够随机)的性能.很显然当左右子树高度平衡,保证了任何插入,删除,查找操作平均性能呢个,当不平衡时(有的子树很高),当 要操作的元素在这个子树时,性能会很差: 2)AVL tree 和Red black tree 都是一种平衡树,它的操作的时间复杂度是:O(lgN) ,N是树的节点的数目: 3)本文实现了AVL Tree, 并