Python数据结构——AVL树的实现_光环大数据Python培训

合集下载

数据结构之AVL树

数据结构之AVL树

左边为调整前得节点,我们可以看出k1的左右子树已不再满足AVL平衡 条件,调整后的为右图。 我们可以看出,解决办法是将z上移一层,并将x下移一层,由于在原树 中k2 > k1,所以k1成为k2的左子树,而y是大于k1的,所以成为k1的右 子树。 为了设计算法,我们这里来看一个更易理解的:插入的是节点“6”
1.3
插入操作
插入的核心思路是通过递归找到合适的位置,插入新结点,然后看新结
点是否平衡(平衡因子是否为2),如果不平衡的话,就分成三种大情 况以及两种小情况: 1. 在结点的左儿子(X < T->item) 在左儿子的左子树 (X < T->l-> item),“外边”,要 做单旋转。 在左儿子的右子树 (X > T->l-> item),“内部”,要 做双旋转。 2. 在结点的右儿子(X > T->item) 在右儿子的左子树(X < T->r-> item),“内部”,要 做双旋转。 在右儿子的右子树(X > T->r-> item),“外边”,要 做单旋转。 3. (X == T->item) ,对该节点的计数进行更新。 当进行了旋转之后,必定会有结点的“父结点”是需要更新的,例如: 2 / \ 1 4 / \ 3 5 \ 6 上图是调整前的,下图是调整后的: 4 / \ 2 5 / \ \ 1 3 6 可以看出,根结点2不平衡,是由于它的右儿子的右子树插入了新的结 点6造成的。因此,这属于“外边”的情况,要进行一次单旋转。于是 我们就把结点4调整上来作为根结点,再把结点2作为4的左儿子,最后 把结点2的右儿子修改为原来的结点4的左儿子。 实现代码: AVLTree Insert(Item X, AVLTree T ) { if( T == NULL ) { /* Create and return a one-node tree */

AVL树研究与实现

AVL树研究与实现

AVL树研究与实现摘要:计算机最广为人知的优点之一是其能储存大量的数据,如今随着时代的发展,储存容量更是犹如日进千里一般极速扩展,大容量的硬盘、u盘早已随处可见。

然而,要在巨大的数据中搜索出需要的内容却不是一件容易的事,由此,为了能减少在搜索储存数据上的开销,各种适应于不同访问搜索背景的数据结构应运而生。

树,便是计算机学科中最基本的数据结构之一,提供了快速的储存和访问性能。

该文探究了带有平衡条件的二叉查找树——avl树的原理,并对其使用c语言进行了实现。

关键词:数据结构;平衡二叉查找树;avl树中图分类号:tp311 文献标识码:a 文章编号:1009-3044(2013)07-1532-04对于大量的输入数据,普通的线性数据结构访问时间太慢,例如,对于一个有n个数据的线性数据结构,假设对每个数据的访问几率大致相同,每个数据每次访问有1/n的机会被访问,由于是线性数据,因此每个数据的访问花销可以经过一定的排列,最通常的是访问第一个数据花销1个单位时间,第二个2个单位时间,第三个3各单位时间……第n个n各单位时间,于是访问一次的平均花销为(n+[n2])/2n = (1+n)/ 2,用计算机专业的符号来说,其访问运行时间可以用o(n)来表示,即访问一次线性数据结构的花销在n这个数量级上。

使用树这一数据结构可将访问花销将至logn这个数量级上,也即o(logn),这里logn是以二为底的n的对数。

可以对比一下,若n=1267650600228229401496703205376,则logn=100。

数字越大,则o(n)与o(logn)相差越大。

一般来说,计算机学科中使用的最基本的树为二叉查找树,下图是一颗二叉树的简单示意图:图1 二叉树示意图二叉查找树则是在二叉树的基础上得来。

假设在一颗二叉树中,每个节点都有一个关键词值,并且关键词值都是互异且可以比较,若对于此二叉树中的每个节点,其左子树中所有节点的关键词值小于其本身关键词值,其右子树中所有关键词值大于其本身关键词值,则此二叉树为二叉查找树。

《python培训课件》数据结构

《python培训课件》数据结构
《Python培训课件》数据 结构
了解数据结构的概念,包括数据类型、线性结构、链表、栈、队列、树结构、 二叉树、堆、图结构等基础内容。
数据类型
学习Python中的各种数据类型,包括数字、字符串、列表、元组、字典、集 合等,以及它们在数据结构中的应用和特点。Fra bibliotek线性结构
1 线性表
学习线性表的定义、特点和操作,包括顺序表和链表。
2 栈与队列
了解栈和队列的概念、实现和应用,以及它们在算法中的重要性。
树结构
1
二叉树
掌握二叉树的定义、创建、遍历和常见操作,并了解二叉搜索树的特点和应用。
2

学习堆的定义、实现和应用,包括最大堆和最小堆。
3
图结构
了解图的基本概念、表示方法和图算法,包括深度优先搜索和广度优先搜索。
排序算法
冒泡排序
其他常用算法
1 计数排序
通过确定每个元素的位置和数量,实 现线性时间复杂度的排序算法。
2 桶排序
将数据分到有限数量的桶中,再对每 个桶进行排序,最后合并桶中的数据。
3 基数排序
按照低位到高位的顺序,对数字进行排序,每一位都使用稳定的排序算法。
动态规划与贪心算法
动态规划
通过将问题划分为子问题,并保存子问题的解,来求 解复杂的问题。
贪心算法
每一步都选择当前最优解,从而逐步得到全局最优解, 不一定是最优解,但常常可以作为近似解。
数据结构实践与应用案例分析
应用所学的数据结构和算法解决实际问题,如建立图形界面、编写算法和进行大规模数据处理等。
通过比较相邻元素的大 小,依次交换元素位置, 将最大或最小的元素冒 泡到最后。
选择排序
从未排序的元素中找到 最小值,放到已排序的 末尾,然后继续从未排 序的元素中选择最小值。

数据结构与算法(5):AVL树

数据结构与算法(5):AVL树

平衡⼆二叉树(AVL树,发明者的姓名缩写):⼀一种⾼高度平衡的排序⼆二叉树,其每⼀一个节点的左⼦子树和右⼦子树的⾼高度差最多等于1。

平衡⼆二叉树⾸首先必须是⼀一棵⼆二叉排序树!平衡因⼦子(Balance Factor):将⼆二叉树上节点的左⼦子树深度减去右⼦子树深度的值。

对于平衡⼆二叉树所有包括分⽀支节点和叶节点的平衡因⼦子只可能是-1,0和1,只要有⼀一个节点的因⼦子不不在这三个值之内,该⼆二叉树就是不不平衡的。

最⼩小不不平衡⼦子树:距离插⼊入结点最近的,且平衡因⼦子的绝对值⼤大于1的节点为根的⼦子树。

n个结点的AVL树最⼤大深度约1.44log2n。

查找、插⼊入和删除在平均和最坏情况下都是O(logn)。

增加和删除可能需要通过⼀一次或多次树旋转来重新平衡这个树。

这个⽅方案很好的解决了了⼆二叉查找树退化成链表的问题,把插⼊入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logN)。

但是频繁旋转会使插⼊入和删除牺牲掉O(logN)左右的时间,不不过相对⼆二叉查找树来说,时间上稳定了了很多。

可以采⽤用动态平衡技术保持⼀一个平衡⼆二叉树。

构造平衡⼆二叉树的时候,也可以采⽤用相同的⽅方法,默认初始时,是⼀一个空树,插⼊入节点时,通过动态平衡技术对⼆二叉树进⾏行行调整。

Adeleon-Velskii和Landis提出了了⼀一个动态地保持⼆二叉排序树平衡的⽅方法,其基本思想是:在构造⼆二叉排序树的过程中,每当插⼊入⼀一个结点时,⾸首先检查是否因插⼊入⽽而破坏了了树的平衡性,若是因插⼊入结点⽽而破坏了了树的平衡性,则找出其中最⼩小不不平衡树,在保持排序树特性的前提下,调整最⼩小不不平衡⼦子树各结点之间的连接关系,以达到新的平衡。

通常这样得到的平衡⼆二叉排序树简称为AVL树。

⾼高度差2。

容易易看出,这种不不平衡出现在下⾯面四种情况:为使树恢复平衡,我们把k2变成这棵树的根节点,因为k2⼤大于k1,把k2置于k1的右⼦子树上,⽽而原本在k1右⼦子树的Y⼤大于k1,⼩小于k2,就把Y置于k2的左⼦子树上,这样既满⾜足了了⼆二叉查找树的性质,⼜又满⾜足了了平衡⼆二叉树的性质。

AVL树——精选推荐

AVL树——精选推荐

AVL树1,AVL树⼜称平衡⼆叉树,它⾸先是⼀颗⼆叉查找树,但在⼆叉查找树中,某个结点的左右⼦树⾼度之差的绝对值可能会超过1,称之为不平衡。

⽽在平衡⼆叉树中,任何结点的左右⼦树⾼度之差的绝对值会⼩于等于 1。

2,为什么需要AVL树呢?在⼆叉查找树中最坏情况下查找某个元素的时间复杂度为O(n),⽽AVL树能保证查找操作的时间复杂度总为O(logn)。

3.avl树通过单旋转或者双旋转来实现保证树的平衡avl树和伸展树有很多相似之处,可以查看:伸展树的特点;AVL树AVL树是根据它的发明者G. M. Adelson-Velskii和E. M. Landis命名的。

它是⼀种特殊的。

AVL树要求: 任⼀节点的左⼦树深度和右⼦树深度相差不超过1(空树的深度为0。

注意,有的教材中,采⽤了不同的深度定义⽅法,所以空树的深度为-1)下⾯是AVL树:AVL树AVL树的特性让⼆叉搜索树的节点实现平衡(balance):节点相对均匀分布,⽽不是偏向某⼀侧。

因此,AVL树的搜索算法复杂度是log(n)的量级。

我们在中定义的操作,除了插⼊,都可以⽤在AVL树上 (假设使⽤懒惰删除)。

如果进⾏插⼊操作,有可能会破坏AVL树的性质,⽐如:插⼊2: 破坏AVL树观察节点5,它的左⼦树深度为2,右⼦树深度为0,所以左右两个⼦树深度相差为2,不再是AVL树。

由于2的加⼊,从节点6,1,5,3到2的层数都增加1。

6, 1, 5节点的AVL性质都被破坏。

如果从节点2向上回溯,节点5是第⼀个被破坏的。

从节点3开始的⼦树深度加1,这是造成6, 1, 5的AVL性质被破坏的本质原因。

我们将5和3之间的路径画成虚线(就好像挂了重物,边被拉断⼀样)。

我们可以通过单旋转(single rotation),调整以5为根节点的⼦树,来修正因为插⼊⼀个元素⽽引起的对AVL性质的破坏。

如下:Single rotation: 左侧超重,向右转通过单旋转,3成为新的根节点,2,5称为3的左右⼦节点。

平衡二叉树的实现及分析

平衡二叉树的实现及分析

平衡二叉树的实现及分析平衡二叉树(Balanced Binary Tree),也称为AVL树,是一种自平衡二叉查找树。

它的每个节点都包含一个额外的平衡因子,即左子树的高度减去右子树的高度,取值为-1、0或1、通过维护这个平衡因子,AVL树可以在查找、插入和删除操作中自动保持平衡,从而保证了较高的性能。

AVL树的实现基于二叉查找树(Binary Search Tree),它的插入和删除操作与二叉查找树相同。

然而,当进行插入或删除操作后,AVL树需要通过旋转操作保持平衡,这是AVL树与普通二叉查找树的主要区别。

AVL树的平衡性保证了树的高度不超过O(log n),这使得查找、插入和删除的平均时间复杂度都为O(log n)。

具体而言,当插入或删除操作导致树不再平衡时,需要进行以下四种旋转操作之一来恢复平衡:1. 左旋(Left Rotation):以当前节点为支点,将其右子节点变为新的根节点,并将原根节点作为新根节点的左子节点。

2. 右旋(Right Rotation):以当前节点为支点,将其左子节点变为新的根节点,并将原根节点作为新根节点的右子节点。

3. 左右旋(Left-Right Rotation):先对当前节点的左子节点进行左旋操作,然后再对当前节点进行右旋操作。

4. 右左旋(Right-Left Rotation):先对当前节点的右子节点进行右旋操作,然后再对当前节点进行左旋操作。

具体的实现中,需要对每个节点保存其高度信息。

在进行插入和删除操作时,先按照二叉查找树的规则进行操作,并更新节点的高度信息。

然后,逐级向上检查每个节点的平衡因子,如果平衡因子不在[-1,0,1]的范围内,就进行相应的旋转操作。

完成旋转后,需要更新相关节点的高度信息。

AVL树的平衡性能保证了在最坏情况下的时间复杂度为O(log n),不过由于维护平衡需要进行旋转操作,相对于普通的二叉查找树,AVL树的插入和删除操作可能会较慢一些。

数据结构课程设计AVL树实现及其分析实验报告

数据结构课程设计AVL树实现及其分析实验报告

算法与数据结构课程设计报告题目: A VLree的实现及分析班级: 12计算机1学号: ************: ***成绩:2013年12月31日一、AVLree的实现及分析AVL 树是平衡的二元查找树。

一株平衡的二元查找树就是指对其每一个节点,其左子树和右子树的高度只差不超过1.编写程序实现AVL树的判别;并实现AVL树的ADT,包括其上的基本操作;节点的加入和删除。

BSt和AVL的差别就在平衡性上,所以AVL的操作关键要考虑如何在保持二元查找树定义条件下对二元树进行平衡化。

(1)编写AVL树的判别程序,并判别一个人元查找数是否为AVL树。

二元查找树用其先序遍历结果表示,如:5,2,1,3,7,8.(2)实现AVL树的ADT,包括其上的基本操作:节点的加入和删除,另外包括将一般二元查找树转变为AVL树的操作。

二、设计思想(宋体,三号加粗)任意给定一组数据,设计一个算法,建立一棵平衡二叉树,对它进行查找、插入、删除等操作。

平衡二叉树ADT结构如下:typedef struct{Status key;}ElemType;typedef struct BSTNode{ElemType data;Status bf;struct BSTNode *lchild,*rchild;}BSTNode,*BSTree;给出一组数据,通过InsertAVL(BSTree &T, ElemType e, Status &taller)插入算法,构建平衡二叉树,若在平衡的二叉排序树T中不存在和e有相同关键字的结点,则插入一个数据元素为e的新结点,并返回1,否则返回0。

若因插入而使二叉排序树失去平衡,则作平衡旋转处理,布尔变量taller反映T长高与否。

在此算法中,利用到递归算法和LeftBalance(BSTree &T)左平衡处理,RightBalance(BSTree &T)右平衡处理。

数据结构中的平衡二叉树AVL树和红黑树的原理与实现

数据结构中的平衡二叉树AVL树和红黑树的原理与实现

数据结构中的平衡二叉树AVL树和红黑树的原理与实现在计算机科学中,数据结构是指一种组织和存储数据的方式,同时也是一种操作数据的方法。

其中,平衡二叉树是一种常用的数据结构,在平衡二叉树中,每个节点的左子树和右子树的高度最多相差1。

然而,平衡二叉树在插入和删除节点时可能会出现树结构不平衡的问题,这就引出了AVL树和红黑树的概念。

一、AVL树的原理与实现AVL树是由G. M. Adelson-Velsky和E. M. Landis于1962年提出的一种自平衡二叉查找树。

它通过在每个节点中添加一个平衡因子来维持树的平衡性。

平衡因子可以是-1、0或1,对应于左子树比右子树高、左右子树高度相等以及右子树比左子树高的情况。

在插入或删除节点时,AVL树会通过旋转操作来调整树的结构,以保持平衡因子的平衡。

旋转操作有四种情况:左旋、右旋、先左旋后右旋和先右旋后左旋。

通过这些旋转操作,AVL树能够保持树的平衡性,从而提高查找、插入和删除操作的效率。

AVL树的实现需要考虑节点的旋转、平衡因子的更新以及树的遍历等问题。

在节点的插入和删除操作中,需要对节点进行平衡处理,并更新相应的平衡因子。

在树的遍历中,可以使用中序遍历、前序遍历或后序遍历等方式来访问树的节点。

二、红黑树的原理与实现红黑树是由Rudolf Bayer在1972年提出的一种平衡二叉查找树。

它通过在每个节点中添加一个额外的属性表示节点的颜色(红色或黑色)来保持树的平衡性。

红黑树具有以下性质:1. 每个节点要么是红色,要么是黑色。

2. 根节点是黑色。

3. 每个叶子节点(NIL节点)是黑色。

4. 如果一个节点是红色,则它的两个子节点都是黑色。

5. 对于每个节点,从该节点到其子孙节点的所有路径上包含相同数目的黑色节点。

通过这些性质,红黑树可以保持树的黑色平衡,在插入和删除节点时通过颜色变换和旋转操作来维持树的平衡性。

与AVL树相比,红黑树的调整操作较为简单,适用于动态插入和删除节点的情况。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Python数据结构——AVL树的实现_光环大数据Python培训我们已经证明,保持 AVL 树的平衡将会使性能得到很大的提升,那我们看看如何在程序中向树插入一个新的键值。

因为所有的新键是作为叶节点插入树的,而新叶子的平衡因子为零,所以我们对新插入的节点不作调整。

不过一旦有新叶子的插入我们必须更新其父节点的平衡因子。

新叶子会如何影响父节点的平衡因子取决于叶节点是左子节点还是右子节点。

如果新节点是右子节点,父节点的平衡因子减 1。

如果新节点是左子节点,父节点的平衡因子将加 1。

这种关系可以递归地应用于新节点的前两个节点,并有可能影响到之前的每一个甚至是根节点。

由于这是一个递归的过程,我们看看更新平衡因子的两个基本条件:递归调用已到达树的根。

父节点的平衡因子已调整为零。

一旦子树平衡因子为零,那么父节点的平衡因子不会发生改变。

我们将实现 AVL 树的子类BinarySearchTree。

首先,我们将重写_put方法,并写一个新的辅助方法updateBalance。

这些方法如Listing 1 所示。

除了第 7 行和第 13 行对 updateBalance的调用,你会注意到_put和简单的二叉搜索树的定义完全相同。

Listing 1updateBalance方法完成了大部分功能,实现了我们刚提到的递归过程。

这个再平衡方法首先检查当前节点是否完全不平衡,以至于需要重新平衡(第 16 行)。

如果当前节点需要再平衡,那么只需要对当前节点进行再平衡,而不需要进一步更新父节点。

如果当前节点不需要再平衡,那么父节点的平衡因子就需要调整。

如果父节点的平衡因子不为零,算法通过父节点递归调用updateBalance 方法继续递归到树的根。

当对一棵树进行再平衡是必要的,我们该怎么做呢?高效的再平衡是使 AVL 树能够很好地执行而不牺牲性能的关键。

为了让 AVL 树恢复平衡,我们会在树上执行一个或多个“旋转”(rotation)。

为了了解什么是旋转,让我们看一个很简单的例子。

思考一下图 3 的左边的树。

这棵树是不平衡的,平衡因子为 -2。

为了让这棵树平衡我们将根的子树节点 A 进行左旋转。

图 3:使用左旋转变换不平衡树执行左旋转我们需要做到以下几点:使右节点(B)成为子树的根。

移动旧的根节点(A)到新根的左节点。

如果新根(B)原来有左节点,那么让原来B的左节点成为新根左节点(A)的右节点。

注:由于新根(B)是 A 的右节点,在这种情况下,移动后的 A 的右节点一定是空的。

我们不用多想就可以给移动后的 A 直接添加右节点。

虽然这个过程概念上看起来简单,但实现时的细节有点棘手,因为要保持二叉搜索树的所有性质,必须以绝对正确的顺序把节点移来移去。

此外,我们需要确保更新了所有的父节点。

让我们看一个稍微复杂的树来说明右旋转。

图 4 的左侧展现了一棵“左重”的树,根的平衡因子为 2。

执行一个正确的右旋转,我们需要做到以下几点:使左节点(C)成为子树的根。

移动旧根(E)到新根的右节点。

如果新根(C)原来有右节点(D),那么让 D 成为新根右节点(E)的左节点。

注:由于新根(C)是 E 的左节点,移动后的 E 的左节点一定为空。

这时可以直接给移动后的 E 添加左节点。

图 4:使用右旋转变换不平衡树现在你已经明白了旋转的过程,了解了旋转的方法,让我们看看代码。

Listing 2 同时显示了右旋转和左旋转的代码。

在第 2 行,我们创建一个临时变量来跟踪新的子树的根。

正如我们之前所说的新的根是旧根的右节点。

现在,右节点已经存储在这个临时变量中。

我们将旧根的右节点替换为新根的左节点。

下一步是调整两个节点的父指针。

如果newRoot原来有左节点,左节点的新父节点变成旧根。

新根的父节点将成为旧根的父节点。

如果旧根是整个树的根,那么我们必须让整棵树的根指向这个新的根。

如果旧根是左节点,那么我们改变左节点的父节点到一个新的根;否则,我们改变右节点的父节点到一个新的根(第10-13 行)。

最后我们设置的旧根的父节点成为新的根。

这里有很多复杂的中间过程,所以建议你一边看函数的代码,一边看图 3。

rotateRight方法和rotateLeft是对称的,所以请自行研究rotateRight的代码。

Listing 2最后,第 16-17 行需要解释一下。

这两行我们更新了旧根和新根的平衡因子。

因为其他操作都是移动整个子树,被移动的子树内的节点的平衡因子不受旋转的影响。

但我们如何在没有重新计算新的子树的高度的情况下更新平衡因子?下面的推导将让你明白,这些代码都是正确的。

图 5:左旋转图5显示了一个左旋转。

B 和 D 是中心节点,A,C,E 是其子树。

让 hX 表示以X为根节点的子树的高度。

通过定义我们知道:newBal(B)=hA−hColdBal(B)=hA−hD但我们知道,D 的高度也可以通过 1 + max(hC,hE) 给定,也就是说,D 的高度为两子树高度中较大者加 1。

记住,hC 和 hE 没有改变。

所以,把上式代入第二个方程,可以得到:oldBal(B)=hA−(1+max(hC,hE))然后两方程作差。

下面是作差的步骤,newBal(B) 使用了一些代数方法简化方程。

beginsplitnewBal(B)−oldBal(B)=hA−hC−(hA−(1+max(hC,hE)))newBal(B)−oldBal(B)=hA−hC−hA+(1+max(hC,hE))newBal(B)−oldBal(B)=hA−hA+1+max(hC,hE)−hCnewBal(B)−oldBal(B)=1+max(hC,hE)−hC接下来我们移动 oldBal(B) 到方程的右端并利用 max(a,b)−c = max(a−c,b −c)。

newBal(B)=oldBal(B)+1+max(hC−hC,hE−hC)但 hE − hC 等同于−oldBal(D)。

所以我们说:max(−a,−b) = −min(a,b),可以通过以下步骤完成对 newBal(B) 的推导:newBal(B)=oldBal(B)+1+max(0,−oldBal(D))newBal(B)=oldBal(B)+1−min(0,oldBal(D))现在方程所有的项都是已知数。

如果我们记得 B 是rotRoot,D 是newRoot,可以看出这正好符合第 16 行的语句:更新节点 D,以及右旋转后的平衡因子的方程推导与此类似。

现在你可能认为步骤都完全了解了。

我们知道如何并且什么时候进行左右旋转,但看看图 6。

由于节点 A 的平衡因子是 -2,我们应该做一个左旋转。

但是,当我们在左旋转时会发生什么?图 6:一棵更难平衡的不平衡树图 7:显示的树左旋转后,仍然不平衡。

如果我们要做一个右旋转来试图再平衡,又回到了开始的状态。

要解决这个问题,我们必须使用以下规则:如果子树需要左旋转使之平衡,首先检查右节点的平衡因子。

如果右节点左重则右节点右旋转,然后原节点左旋转。

如果子树需要右旋转使之平衡,首先检查左节点的平衡因子。

如果左节点右重则左节点左旋转,然后原节点右旋转。

图 8 显示了这些规则如何解决了我们在图 6 和图 7 中遇到的问题。

首先,以 C 为中心右旋转,树变成一个较好的形状;然后,以 A 为中心左旋转,整个子树恢复平衡。

图 8:右旋转后左旋转实现这些规则的代码可以从我们“再平衡”(rebalance)的方法中找到,如Listing 3 所示。

上面的第一条规则从第二行if语句中实现。

第二条规则是由第 8 行elif语句实现。

Listing 3通过保持树的平衡,我们可以确保get方法运行的时间复杂度为 O(log2n)。

但问题是put方法的时间复杂度是多少?我们把put操作进行分解。

由于每一个新节点都是作为叶节点插入的,每一轮更新所有父节点的平衡因子最多只需要log2n 次操作,每层执行一次。

如果子树是不平衡的最多需要两个旋转把子树恢复平衡。

但是,每个旋转的操作的复杂度为 O(1) ,所以即使我们进行put操作最终的复杂度仍然是 O(log2n)。

为什么大家选择光环大数据!大数据培训、人工智能培训、Python培训、大数据培训机构、大数据培训班、数据分析培训、大数据可视化培训,就选光环大数据!光环大数据,聘请大数据领域具有多年经验的讲师,提高教学的整体质量与教学水准。

讲师团及时掌握时代的技术,将时新的技能融入教学中,让学生所学知识顺应时代所需。

通过深入浅出、通俗易懂的教学方式,指导学生较快的掌握技能知识,帮助莘莘学子实现就业梦想。

光环大数据启动了推进人工智能人才发展的“AI智客计划”。

光环大数据专注国内大数据和人工智能培训,将在人工智能和大数据领域深度合作。

未来三年,光环大数据将联合国内百所大学,通过“AI智客计划”,共同推动人工智能产业人才生态建设,培养和认证5-10万名AI大数据领域的人才。

参加“AI智客计划”,享2000元助学金!【报名方式、详情咨询】光环大数据网站报名:手机报名链接:http:// /mobile/。

相关文档
最新文档