首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

算法

前情提要 是AVL里最流行的变种,有些资料甚至说自从出来以后,AVL就被放到博物馆里了。是否真的有那么优秀,我们一看究竟。遵循以下5点规则,需要我们理解并熟记。...规则: 1.树节点要么是的,要么是的 2.的根节点是的 3.的叶节点链接的空节点都是的,即nullNode为 4.红色节点的左右孩子必须是的 5.从某节点到null节点所有路径都包含相同数目的节点...正是因为作为二叉查找满足这些性质,才使得的节点是相对平衡的。...即可以保证的深度是对数的,可以保证对的查找、插入删除等操作满足对数级的时间复杂度。 下边我们将讨论最主要的两个算法,插入和删除。...而对于问题2,我们可以把当前节点涂黑就可以让满足的性质。

1.2K120
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    数据算法

    赶紧抓起手上的电话,打开微信秘籍酷,查看今天的装逼巅峰话题!今天林药师亲自调制,无色无味,居家旅行装逼必备良品,服一剂神清气爽,服两剂目瞪口呆! 先来看一棵什么是: ?...像上面这样的一条腿太长的,就是不平衡的,那怎么才能平衡呢?噔噔噔,隆重出场,首先是定义: 1,中的节点都是有颜色的,要么红色,要么黑色。 2,树根节点的颜色是黑色的。...这就是保证相对平衡的秘籍。请看: ?...在数据处理中,是另一位备受宠爱的明星,他不仅是Linux中非线性数据结构的标准算法,而且是JAVA中TreeMap、TreeSet机制、C++中的STL这些经典工具背后的强大逻辑支撑。...当然,像这样算法比较复杂的逻辑,是很难在三言两语中就搞透的,本文只是引入 一些基本概念,深入的逻辑分析、代码实现可以在我的书里看到。点击阅读原文可以找到。

    51320

    算法原理系列:

    本文还是着重描述的诞生过程,尽量理清它背后的设计哲学。 思考: 是如何动态平衡的? 和23之间有什么关系? 如果这两个问题已经了然于胸,那可以直接略过此文了。...,从上图来看已经很明显了,一个结点为,一个结点为,用来表示两种状态,既然有了两个标识,那算法一定是从这两个状态上下功夫,不急,咱们此时回顾下23中是如何实现动态平衡的。...这是《算法》对于的定义,和网上流传的版本不太一样,但我个人觉得它更切中的要害,红色加粗现表示了什么?它的意思就是说,结点a和结点b【看上去】是不可分割的一个整体。...现在,我们来看看《算法》书上的红色链接的定义: 链接均为左链接。 没有任何一个结点同时和两条链接相连。 该是完美黑色平衡,即任意空链接到根结点的路径上的链接数量相同。...旋转操作 上述定义都是为了让符合23的初始定义,而接下来才是动态平衡的真正核心,插入旋转操作,完全可以类比23的向上分裂操作。我们现在来模拟的创建过程。

    55810

    (一):构建

    这一篇文章就来看看如何构建 对于平衡二叉的构建,可以参考小程序中的文章(C++版)。...平衡二叉 属于平衡二叉,但是并非严格意义上的平衡二叉,因为平衡二叉要求节点的左右子树高度差不超过1, 而放弃了这种高度平衡,利用对结点上色的操作来保证相对平衡,这其中原因大概是维护一个绝对平衡的二叉代价太大...但如果插入频率小或者只有一次构建,那么平衡二叉的查询性能还是比高。...此时构建平衡分为4种情况: 情况一:为空,此时插入结点充当根结点,上色为 情况二:插入结点已经存在,此时替换插入结点值即可 情况三:插入结点的位置,其父结点是黑色,此时平衡未打破,插入完成...到这里就构建完成了 相对于构建新增,的删除情况更为复杂,由于时间关系(这周只有一天休息加上绘图太费劲),留到下一次分享。 构建代码 构建源码

    1.7K42

    概念 ,是一种二叉搜索,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或 Black。...通过对任何一条从根到叶子的路径上各个结点着色方式的限制,确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。...的性质 每个结点不是红色就是黑色 根节点是黑色的 如果一个节点是红色的,则它的两个孩子结点是黑色的,中没有连续的节点 对于每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点...每个叶子结点都是黑色的(此处的叶子结点指的是空结点) 为什么满足上面的性质,就能保证:其最长路径中节点个数不会超过最短路径中节点个数的两倍?...插入 的叔叔是关键 u存在且为,变色继续向上处理 u不存在或存在且为,旋转(单旋+双旋)+变色 情况一:cur为,parent为,grandfather为(固定),uncle存在且为

    47320

    ,因此就出现了很多自平衡的二叉查找,这些自平衡二叉查找的查询效率都会稳定在O(logN),就是一种自平衡的二叉查找。...下面我们会红的特征、插入以及删除来分析是如何进行自平衡的。...特征 想要了解如何自平衡,就必须了解的特征,因为自平衡操作都是围绕这些特征来的,一旦一个因为插入和删除节点打破了自身的特征,那么他就需要进行自平衡(变色、旋转)来使得二叉重新满足的特征...通过上述特征,决定了的一个重要特性:从根到叶子的最长的可能路径不多于最短路径的两倍长。 下图是一张示意图: ?...,需要我们细细揣摩,并且反复的研究,在了解的基本概念以后,我们后续会分析一下HashMap中实现以及着手自己实现一个

    94020

    前言 的应用还是比较广泛的。比如Java8的HashMap的底层就用到了,还有TreeMap和TreeSet也用到了。 下面主要以下几个方面学习一下。...1)二叉查找BST 2)RBTree的规则、增删查 3)的Java实现。...其中两款具有代表性的平衡分别为AVL。AVL由于实现比较复杂,而且插入和删除性能差,在实际环境下的应用不如。...下图中这棵,就是一颗典型的: ? 什么情况下会破坏的规则,什么情况下不会破坏规则呢?我们举两个简单的栗子: 添加节点 1.向原插入值为14的新节点: ?...由于父节点15是黑色节点,因此这种情况并不会破坏的规则,无需做任何调整。 2.向原插入值为21的新节点: ?

    85731

    在JDK8之前其实就已经有的应用,比如TreeMap的底层就是用了的数据结构。本文主要是为了讲解JDK8中HashMap底层数据结构的铺垫。...一、二叉查找BST 的本质就是一颗二叉查找,二叉查找的特点如下: (1)左节点的值都小于或等于其父类(父类或根节点)的值。...二、RBTree 其实是基于二叉查找的一颗平衡二叉查找,具有以下特点: (1)结点是红色或黑色的,在hashMap实现中用boolean的true和false表示红色或黑色。...再经过变色后,形成最终的: ? 三、总结 个人觉得是一个挺不错的思想,在BST的基础上还引入了颜色的特点,通过变色和旋转来保持的特点,保证的平衡。...的前身其实是234,有兴趣的小伙伴可以了解下234,234的操作完全是等价的。之所以在java中使用的数据结构是因为如果直接使用234实现会非常繁琐。

    72720

    的介绍 (Red-Black Tree,简称R-B Tree),它一种特殊的二叉查找。...是特殊的二叉查找,意味着它满足二叉查找的特征:任意一个节点所包含的键值,大于等于左孩子的键值,小于等于右孩子的键值。 除了具备该特性之外,还包括许多额外的信息。...的每个节点上都有存储位表示节点的颜色,颜色是(Red)或(Black)。 的特性: (1) 每个节点或者是黑色,或者是红色。 (2) 根节点是黑色。 (3) 每个叶子节点是黑色。...因而,是相对是接近平衡的二叉。...示意图如下: AVL的介绍 https://www.cnblogs.com/skywang12345/p/3577479.html AVL是高度平衡的而二叉

    73800

    什么是 依然是一棵二分搜索,《算法导论》中的定义如下: 每个节点或者是红色的,或者是黑色的 根节点是黑色的 每一个叶子节点(最后的空节点)是黑色的 如果一个节点是红色的,那么他的孩子节点都是黑色的...和AVL:由于的最大高度是2logn,所以在查找时,相比于AVL会慢一些,而的添加和删除元素比AVL更快一些,如果只是用于查询,AVL的性能要更高一些。   ...由于我们在本文是定义的所有红色节点都是向左倾斜的,当我们新添加的红色节点在根节点的右侧时,我们需要先进行左旋转擦欧总,然后再进行染色操作,在我们左旋转的过程中并不保持的性质,如下图: 左旋转的代码实现...,就分析到这里了,下面让我们来用代码实现一个的添加操作: public class RBTree, V> { private static...(key, value),递归算法 // 返回插入新节点后的根 private Node add(Node node, K key, V value){ if(node

    13610

    这样就能让整棵的高度相对来说低一些,相应的插入、删除、查找等操作的效率高一些。 # 什么是 的英文是 “Red-Black Tree”,简称 R-B Tree。...中包含最多黑色节点的路径不会超过 log2n,所以加入红色节点之后,最长路径不会超过 2log2n,也就是说,的高度近似 2log2n。...所以,的高度只比高度平衡的 AVL 的高度(log2n)仅仅大了一倍,在性能上,下降得并不多。这样推导出来的结果不够精确,实际上的性能更好。...# 平衡调整 # 插入操作的平衡调整 规定,插入的节点必须是红色的。而且,二叉查找中新插入的节点都是放在叶子节点上。...# 参考资料 数据结构与算法之美 数据结构 二叉

    39610

    的模拟实现

    前言 我在前面的文章中,已经详细讲解了二叉搜索(二叉搜索的模拟实现-CSDN博客)、AVL(AVL模拟实现-CSDN博客)的模拟实现,终于,我要讲解啦~~~,让我们进入正题吧 ヾ(≧▽≦*...)o 概念 也是一棵二叉搜索,它有如下特点 1、每个节点不是红色就是黑色 (从树名字就可得知) 2、根节点是黑色的 (这是检查是否正确的一个判断条件) 3、如果一个节点是红色的...,均包含相同数目的黑色节点 (这是检查是否正确的一个判断条件) 这些特点使得效率也很高,因为他们构成了一个大特点: 最长路径的节点个数 <= 2 * 最短路径的节点个数 为什么满足...,诞生了 的模拟实现 “颜色”定义 虽然有颜色,但是红色和黑色并不是真的颜色,而是用了枚举enum的知识,将字符串转化为数字(内部),因此黑色红色的定义就是一个枚举 enum COLOR {...我们进行第三步 (3) 叔叔变为黑色 如下图所示 细心的读者可能会发现:爷爷的颜色变为红色了 在这个非的树下,我们就需要对“红色”极其敏感 这里爷爷不一定是祖先,所以,我们应该注意爷爷的父亲是什么颜色

    7710

    原理及实现

    也是一种平衡二叉应用广泛,linux内核的rbtree.c,jdk的TreeMap和HashMap等都实现树结构。写的性质前,先按照自己的思维去考虑,为什么这样定义。...设高度为h,则到叶子结点最短路径(最小高度)大于等于h/2(根据性质45可得)。的增删改查时间复杂度都是O(lgn)。    一颗含有n个结点的,最大高度为2log(n+1)。...相关证明可以参考算法导论。 四.二叉搜索的旋转      二叉搜索分为左旋和右旋,旋转的最终目的就是使得的高度降低。...这种情况和插入中的第一种情况类似,的插入只有第一种情况可能会让整个各个路径的结点个数加1。同样删除中的这种情况,也可能会让整个各个路径的结点个数减一。...七.实现 java版 package pers.pzt.seckill; public class RBTree> { //结点定义 private

    55810

    历史上AVL流行的另一变种是(red black tree)。...对于的操作在最坏情形下花费O(log N)时间,而且我们将看到,(对于插入操作的)一种慎重的非递归实现可以相对容易地完成(与AVL相比)。...2、自顶向下树上滤的实现需要用一个栈或用一些父指针保存路径。我们看到,如果我们使用一个自顶向下的过程,实际上是对红应用从顶向下保证S不会是的过程,则伸展会更有效。这个过程在概念上是容易的。...的具体实现是复杂的,这不仅因为有大量的可能的旋转,而且还因为一些子树可能是空的,以及处理根的特殊的情况(尤其是根没有父亲)。...注意,对于带有一个儿子的节点的情形,我们不想使用这种方法进行,因为这可能在的中部连接两个红色节点,为条件的实现增加苦难。

    75110

    原文链接:https://my.oschina.net/hosee/blog/618828 一、的介绍 先来看下算法导论对R-B Tree的介绍: ,一种二叉查找,但在每个结点上增加一个存储位表示结点的颜色...在很多底层的实现上,有大量实现。...算法时间复杂度和AVL相同,但统计性能比AVL更高。 当然,并不适应所有应用的领域。如果数据基本上是静态的,那么让他们待在他们能够插入,并且不影响平衡的地方会具有更好的性能。...是一个更高效的检索二叉,因此常常用来实现关联数组(“关联数组”是一种具有特殊索引方式的数组。不仅可以通过整数来索引它,还可以使用字符串或者其他类型的值(除了NULL)来索引它。)。...虽然 HashMap 和 HashSet 实现的接口规范不同,但 TreeSet 底层是通过 TreeMap 来实现的,因此二者的实现方式完全一样。而 TreeMap 的实现就是算法

    75840

    玩转:手把手教你实现和理解

    引言相信学习过编程的都或多或多或少的听说过“”,在了解之前,需要明白它是一个二叉,那么在哪些场景/地方使用过呢?java的hash map。Linux系统的CFS公平调度算法。...1.2、代码实现了解了理论,就需要代码上进行实现。定义树节点结构体包含以下内容:定义一个颜色标识符。定义左子树和右子树的指针。定义执行父节点的指针。这个是为了做性质调整需要。...最大的问题是这个的定义不可复用,它的业务和实现是黏在一起的,可迁移性低。为了提高通用性和灵活性,可以将的定义做成模板化,将的性质封装在一起。...以根结点示例:小结:插入或删除节点,最多需要旋转的次数是的高度。2.2、代码实现(1)左旋。左旋函数的实现需要带哪些形参呢?答案是头节点和旋转节点。...4.2、代码实现/**********************删除 start***************************/rbtree_node *rbtree_mini(rbtree

    13600

    TypeScript实现AVL

    本文将详解两种自平衡:AVL并用TypeScript将其实现,欢迎各位感兴趣的开发者阅读本文。...:故名思义,即中的节点不是的就是的,它也是一个自平衡二叉。...上面我们实现了AVL,我们在向AVL中插入或移除节点可能会造成旋转,所以我们需要一个包含多次插入和删除的自平衡是比较好的。插入或删除频率比较低,那么AVL更好。...实现思路 的每个节点都需要遵循以下原则: 节点不是的就是的根节点是的 所有叶节点都是的 如果一个节点是的,那么它的两个子节点都是的 不能有两个相邻的节点,一个节点不能有的父节点或子节点...,节点插入完成后判断的规则是否得到满足 重写插入节点函数,插入时保存父节点的引用,返回节点的引用验证插入后的属性 验证属性 要验证是否还是平衡的以及满足它的所有要求,我们需要使用两个概念

    51010
    领券