平衡树

平衡树以及AVL树

余生长醉 提交于 2020-04-08 12:30:57
  平衡树是计算机科学中的一类数据结构。 平衡树是计算机科学中的一类改进的二叉查找树。一般的二叉查找树的查询复杂度是跟目标结点到树根的距离(即深度)有关,因此当结点的深度普遍较大时,查询的均摊复杂度会上升,为了更高效的查询,平衡树应运而生了。   在这里,平衡指所有叶子的深度趋于平衡,更广义的是指在树上所有可能查找的均摊复杂度偏低。   几乎所有平衡树的操作都基于树操作,通过旋转操作可以使得树趋于平衡。 对一棵查找树(search tree)进行查询/新增/删除 等动作, 所花的时间与树的高度h 成比例, 并不与树的容量 n 成比例。如果可以让树维持矮矮胖胖的好身材, 也就是让h维持在O(lg n)左右, 完成上述工作就很省时间。能够一直维持好身材, 不因新增删除而长歪的搜寻树, 叫做balanced search tree(平衡树)。 旋转Rotate —— 不破坏左小右大特性的小手术 平衡树有很多种, 其中有几类树维持平衡的方法, 都是靠整形小手术。   各种平衡树:AVL树,经典平衡树,所有操作的最坏复杂度是O(lgN)的。         Treap,利用随机堆的期望深度来优化树的深度,达到较优的期望复杂度。         伸展树、红黑树,节点大小平衡树。2-3树、AA树。 AVL树:    AVL树是一棵自平衡的二叉搜索树

C#实现平衡多路查找树(B树)

有些话、适合烂在心里 提交于 2020-03-22 05:59:22
写在前面:搞了SQL Server时间也不短了,对B树的概念也算是比较了解。去网上搜也搜不到用C#或java实现的B树,干脆自己写一个。实现B树的过程中也对很多细节有了更深的了解。 简介 B树是一种为辅助存储设计的一种数据结构,在1970年由R.Bayer和E.mccreight提出。在文件系统和数据库中为了减少IO操作大量被应用。遗憾的是,他们并没有说明为什么取名为B树,但按照B树的性质来说B通常被解释为Balance。在国内通常有说是B-树,其实并不存在B-树,只是由英文B-Tree直译成了B-树。 一个典型的 B树如图1所示。 图1.一个典型的B树 符合如下特征的树才可以称为B树: 根节点如果不是叶节点,则至少需要两颗子树 每个节点中有N个元素,和N+1个指针。每个节点中的元素不得小于最大节点容量的1/2 所有的叶子位于同一层级(这也是为什么叫平衡树) 父节点元素向左的指针必须小于节点元素,向右的指针必须大于节点元素,比如图1中Q的左指针必须小于Q,右指针必须大于Q 为什么要使用B树 在计算机系统中,存储设备一般分为两种,一种为主存(比如说CPU二级缓存,内存等),主存一般由硅制成,速度非常快,但每一个字节的成本往往高于辅助存储设备很多。还有一类是辅助存储(比如硬盘,磁盘等),这种设备通常容量会很大,成本也会低很多,但是存取速度非常的慢,下面我们来看一下最常见的辅存--硬盘。

C#实现平衡多路查找树(B树)

自古美人都是妖i 提交于 2020-02-26 23:22:03
原文: C#实现平衡多路查找树(B树) 写在前面:搞了SQL Server时间也不短了,对B树的概念也算是比较了解。去网上搜也搜不到用C#或java实现的B树,干脆自己写一个。实现B树的过程中也对很多细节有了更深的了解。 简介 B树是一种为辅助存储设计的一种数据结构,在1970年由R.Bayer和E.mccreight提出。在文件系统和数据库中为了减少IO操作大量被应用。遗憾的是,他们并没有说明为什么取名为B树,但按照B树的性质来说B通常被解释为Balance。在国内通常有说是B-树,其实并不存在B-树,只是由英文B-Tree直译成了B-树。 一个典型的 B树如图1所示。 图1.一个典型的B树 符合如下特征的树才可以称为B树: 根节点如果不是叶节点,则至少需要两颗子树 每个节点中有N个元素,和N+1个指针。每个节点中的元素不得小于最大节点容量的1/2 所有的叶子位于同一层级(这也是为什么叫平衡树) 父节点元素向左的指针必须小于节点元素,向右的指针必须大于节点元素,比如图1中Q的左指针必须小于Q,右指针必须大于Q 为什么要使用B树 在计算机系统中,存储设备一般分为两种,一种为主存(比如说CPU二级缓存,内存等),主存一般由硅制成,速度非常快,但每一个字节的成本往往高于辅助存储设备很多。还有一类是辅助存储(比如硬盘,磁盘等),这种设备通常容量会很大,成本也会低很多,但是存取速度非常的慢

AVL树(Java)

余生长醉 提交于 2020-02-09 14:03:36
AVL树 在计算机科学中,AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。 特点 1.本身首先是一棵 二叉搜索树 。 2.带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。也就是说, AVL树,本质上是带了平衡功能的二叉查找树(二叉排序树,二叉搜索树) 平衡因子 某 结点的左子树与右子树的高度(深度)差 即为该结点的平衡因子(BF,Balance Factor)。平衡二叉树上所有结点的平衡因子只可能是 -1,0 或 1。 高度(height) 为了方便计算每一结点的平衡因子我们可以为每个节点赋予height这一属性,表示此节点的高度。 这里的高度是由叶子节点从下向上计算的,叶子节点的height是1,叶子节点的父节点height是2,以此类推。 旋转 AVL树的基本操作一般涉及运做同在不平衡的二叉查找树所运做的同样的算法。但是要进行预先或随后做一次或多次所谓的"AVL 旋转"。 假设由于在二叉排序树上插入结点而失去平衡的最小子树根结点的指针为a(即a是离插入点最近,且平衡因子绝对值超过1的祖先结点),则失去平衡后进行进行的规律可归纳为下列四种情况: 单向右旋平衡处理LL :由于在a的左子树根结点的左子树上插入结点,a的平衡因子由1增至2

二叉搜索树与平衡二叉树

北城余情 提交于 2020-01-31 04:51:54
二叉搜索树 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 定义 二叉搜索树是一种节点值之间具有一定数量级次序的二叉树,对于树中每个节点: 若其左子树存在,则其左子树中每个节点的值都不大于该节点值; 若其右子树存在,则其右子树中每个节点的值都不小于该节点值。 示例: 平衡二叉树 平衡二叉树(Balanced Binary Tree)具有以下性质: 它是一棵空树或它的左右两个子树的高度差的绝对值不超过1, 并且左右两个子树都是一棵平衡二叉树。 平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。 最小二叉平衡树的节点的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列,可以参考Fibonacci数列,1是根节点,F(n-1)是左子树的节点数量,F(n-2)是右子树的节点数量。 如下图所示,左图是一棵平衡二叉树,根节点10,左右两子树的高度差是1,而右图,虽然根节点左右两子树高度差是0,但是右子树15的左右子树高度差为2,不符合定义,所以右图不是一棵平衡二叉树。 来源: CSDN 作者: 飞飞晗 链接: https://blog.csdn.net/weixin_42247922/article/details/104110921

二叉查找树(查找、插入、删除)——C语言

瘦欲@ 提交于 2020-01-08 06:29:48
AVL树 平衡二叉查找树(Self-balancing binary search tree)通常是指一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且任意节点的左右两个子树都是一棵平衡二叉树(即严格的平衡二叉查找树, “严格”二字体现在任意节点的左右子树高度差不超过1 ),平衡二叉树有多种实现方法(红黑树、AVL、替罪羊树、Treap、伸展树等) 本篇随笔分析的AVL树( AVL树是根据它的发明者G. M. A delson- V elskii和 E. M. L andis命名的 ),是在二叉查找树的基础上一个优化版本(AVL树是严格的二叉查找树,而红黑树不是,红黑树是非严格的二叉查找树,红黑树有自己的一套规则来保证整棵树接近平衡) AVL树的特点: 1.本身首先是一棵二叉查找树 2.带有平衡条件:每个结点的左右子树的高度之差的绝对值不超过1, 也就是说,AVL树,本质上是带了平衡功能的二叉查找树 如果读者关于二叉查找树还不了解可以看一下这篇随笔: 二叉查找树(查找、插入、删除) AVL树的作用 AVL树解决了二叉查找树可能出现的极端情况,对于一般的二叉搜索树(Binary Search Tree),其期望高度(即为一棵平衡树时)为log2n,其各操作的时间复杂度(O(log2n))同时也由此而决定,但是在某些极端情况下 (如在插入的序列是有序的时)

Red Black Tree 红黑树 AVL trees 2-3 trees 2-3-4 trees B-trees Red-black trees Balanced search tree 平衡搜索树

点点圈 提交于 2020-01-04 03:02:56
小结: 1、红黑树:典型的用途是实现 关联数组 2、旋转 当我们在对红黑树进行插入和删除等操作时,对树做了修改,那么可能会违背红黑树的性质。 为了保持红黑树的性质,我们可以通过对树进行旋转,即修改树中某些结点的颜色及指针结构,以达到对红黑树进行插入、删除结点等操作时,红黑树依然能保持它特有的性质(五点性质)。 https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-046j-introduction-to-algorithms-sma-5503-fall-2005/video-lectures/lecture-10-red-black-trees-rotations-insertions-deletions/lec10.pdf Balanced search trees Balanced search tree: A search-tree data structure for which a height of O(lg n) is guaranteed when implementing a dynamic set of n items. AVL trees 2-3 trees 2-3-4 trees B-trees Red-black trees 【1】 Example of a

AVL树(平衡二叉树)

匆匆过客 提交于 2019-12-30 05:42:36
定义及性质   AVL树:AVL树是一颗自平衡的二叉搜索树.   AVL树具有以下性质:     根的左右子树的高度只差的绝对值不能超过1     根的左右子树都是 平衡二叉树(AVL树) 百度百科:   平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树(有别于AVL算法)     且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。     平衡二叉树的常用实现方法有 红黑树 、 AVL 、 替罪羊树 、 Treap 、 伸展树 等。        最小二叉平衡树的节点总数的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的 数列 ,        可以参考Fibonacci(斐波那契)数列,1是根节点,F(n-1)是左子树的节点数量,F(n-2)是右子树的节点数量。 AVL树--插入操作 AVL插入--旋转 代码实现 from bst import BST, BiTreeNode class AVLNode(BiTreeNode): def __init__(self, data): BiTreeNode.__init__(self, data) self.bf = 0 class AVLTree(BST): def __init__(self,

C#与数据结构--树论--平衡二叉树(AVL Tree)

百般思念 提交于 2019-12-25 05:41:40
1. 为什么平衡树? 在二叉搜索树(BST,Binary Search Tree)中提到,BST树可能会退化成一个链表( 整棵树中只有左子树,或者只有右子树 ),这将大大影响二叉树的性能。 前苏联科学家G.M. Adelson-Velskii 和 E.M. Landis给出了答案。他们在1962年发表的一篇名为《An algorithm for the organization of information》的文章中提出了一种自平衡二叉查找树( self-balancing binary search tree )。这种二叉查找树在插入和删除操作中,可以通过一系列的旋转操作来保持平衡,从而保证了二叉查找树的查找效率。最终这种二叉查找树以他们的名字命名为“AVL-Tree”,它也被称为平衡二叉树(Balanced Binary Tree)。 2. 原理 在节点上设置一个平衡因子BF,代表左右子树的高度差,BF = { -1, 0, 1}。 3. 旋转 AVL的Insert/Delete操作可能会引起树的失衡,可以通过选择解决这个问题。 3.1 4种旋转 (1)LL (2)RR (3)LR (4)RL 在下面的文章中有一个关于AVL选择的动画,大家不妨看看。 C#与数据结构--树论--平衡二叉树(AVL Tree) 3.2 旋转实现 在算法导论中给出旋转的伪代码: LEFT

平衡二叉树(AVL树)简单解析

倾然丶 夕夏残阳落幕 提交于 2019-12-21 10:10:32
平衡二叉树定义:二叉排序树的平衡因子绝对值小于等于1,即平衡因子为-1、0、1,那么是平衡二叉树(平衡因子:根结点的左子树深度减右子树深度的差)。 最小不平衡子树:子树的根结点距离插入结点距离最近,且平衡因子绝对值大于1的树为最小不平衡子树。 平衡二叉树:当插入结点后出现最小不平衡子树,那么就要对最小不平衡子树重新构造,通过顺时针(平衡因子皆为正)或逆时针(平衡因子皆为负)旋转最小不平衡子树的根结点使之成为平衡二叉树。注意:如果最小不平衡子树的根结点与页结点不是同号的,需要将其先转为同号再进行上述旋转(如何双旋转:如果最小不平衡树的根结点平衡因子为负数,说明其右子树深度高,为R,结点逆时针旋转;如果最小不平衡树的根结点右子树平衡因子为正数,说明其左子树深度高,为L,结点顺时针旋转;这样就形成了从上往下为RL,则先下子树L旋转,再上子树R旋转;反之为LR旋转)。 我们在处理平衡二叉树的时候回出现4中情况: LL型单旋转,顺时针旋转(新增结点在最小不平衡子树根的左子树的左子树下,L表示左子树,数字2表示平衡因子) LR型双旋转,先下后上旋转,先R逆时针选择,后L顺时针旋转(新增结点在最小不平衡子树根的左子树的右子树下,L表示左子树,数字2表示平衡因子) RR型单旋转,逆时针旋转(新增结点在最小不平衡子树根的右子树的右子树下,R表示右子树,数字-2表示平衡因子) RL型双旋转