红黑树及JDK中应用

Java并发进阶系列:jdk1.8的HashMap红黑树设计原理及其源代码深入解析(不含balanceDetection方法) 本文深入解析了JDK1.8中HashMap红黑树部分的实现原理,主要包含以下内容: 背景知识:介绍了红黑树的命名由来及其与二叉搜索树的关系。 红黑树的5个核心性质:包括节点颜色规则、根节点和叶子节点要求、红节点限制以及黑色平衡特性。 变色及旋转操作的必要性:解释了通过变色、左旋和右旋操作来维护红黑树平衡的原理。 详细图解了左旋操作的完整过程,展示了节点关系调整的具体实现方式。 文章通过大量图示和实例,帮助读者深入理解红黑树在HashMap中的实现机制及其平衡维护策略,适合已具备基础数据结构知识的开发者阅读。 阅读详情

红黑树

我们看到二叉搜索树在动态集合操作时,其时间复杂度均为O(h),在搜索树高度较低时,有不错的性能,但如果树的高度较高时,这些集合操作并不比在链表上快。红黑树是平衡搜索树中的一种,可以保证在最坏情况下动态集合操作的时间复杂度为O(lgn)

红黑树的性质

红黑树是一颗二叉搜索树,在每个节点上增加一个存储位来表示节点的颜色,可以是RED或BLACK。通过对任何一条从根到叶子的简单路径上各个节点的颜色进行约束,确保没有一条路径会比其它路径长出2倍,近似于平衡

树中每个节点包含5个属性:color、key、left、right和p。如果一个节点没有子节点或父节点,则该节点相应属性的值为NIL。一颗红黑树是满足如下红黑性质的二叉搜索树

  • 每个节点只能是红色或黑色中的一种

  • 根节点是黑色

  • 每个叶节点(NIL)是黑色

  • 如果一个节点是红色的,它的两个孩子节点都是黑色

  • 每个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数量的黑色节点

为便于处理红黑树中边界条件,使用一个哨兵来代表NIL。对于红黑树T,哨兵T.nil是一个与树中普通节点有相同属性的对象,color属性为BLANCK。使用哨兵节点后,可以将节点x的NIL孩子视为一个普通节点,x为其父节点。我们可以为树内的每个NIL新增一个不同的哨兵节点,使每个父节点都有比较好的定义,但这样会浪费空间。另一种方式是使用一个哨兵T.nil来代表所有的NIL:所有的叶节点和根节点的父节点。

我们将注意力放在红黑树的内部节点上,因为他们存储了关键子的值。从某个节点x出发,不包含该节点,到达一个叶节点的任意一条简单路径上黑节点的个数称为该节点的黑高,记为bh(x).根据性质5,黑高的性质为每个节点到其叶节点的简单路径上黑色节点的个数都相同,于是定义红黑树的黑高为其根节点的黑高

引理:一颗有n个内部节点的红黑树的高度至多为2lg(n+1)

由上述引理可知,动态集合操作SEARCH、MINIMUM、MAXIMUM、SUCCESSOR和PREDECESSOR可在红黑树上O(lgn)时间内执行,这些操作在一颗高度为h的二叉搜索树上的运行时间为O(h),任何包含n个节点的红黑树都是高度为O(lgn)的二叉搜索树

旋转

搜索树操作TREE-INSERT和TREE-DELETE在含n个关键字的红黑树上,运行花费时间为O(lgn),但由于这两个操作对树做了修改,可能会使修改后的树违反红黑树的性质,为维持这些性质,必须改变树中某些节点的颜色以及指针结构

指针结构的修改是通过旋转来完成,通过旋转可以保持二叉搜索树的性质。树的旋转分为左旋和右旋。当在某个节点x上做左旋时,假设他的右孩子是y而不是T.nil;x可以为其右孩子不是T.nil节点的树内任意节点。左旋以x到y的链为支轴进行,它使y成为该子树新的根节点,x成为y的左孩子,y的左孩子成为x的右孩子

在这里插入图片描述

二叉搜索树上的旋转操作。LEFT-ROTATE(T, x)通过改变常数数目指针,可以将右边两个结点结构转变为左边的结构。左边的结构可以使用相反的操作RIGHT-ROTATE(T, y)来转变成右边结构,字母a、b、c代表任意子树。旋转操作保持了二叉搜索树的性质

在LEFT-ROTATE的伪代码中,假设x.right!=T.nil且根节点的父节点为T.nil

LEFT-ROTATE(T, x)
1   y = x.right
2   x.right = y.left
3   if y.left != T.nil
4       y.left.p = x
5   y.p = x.p
6   if x.p == T.nil
7       T.root = y
8   elseif x == x.p.left
9       x.p.left = y
10  else x.p.right = y
11  y.left = x
12  x.p = y

RIGHT-ROTATE操作的代码与LEFT-ROTATE对称。都在O(1)时间内完成运行。在旋转过程中只会改变指针,其他所有属性都保持不变

插入

可以在O(lgn)时间内完成向一颗含n个节点的红黑树中插入一个新节点。我们先按照普通二叉搜索树完成新节点z的插入操作,然后将z着为红色。为保证红黑性质能继续保持,调用RB-INSERT-FIXUP来对节点重新着色并旋转。调用RB-INSERT(T, z)在红黑树T内完成插入新节点操作

RB-INSERT(T, z)
1   y = T.nil
2   x = T.root
3   while x != T.nil
4       y = x
5       if z.key < x.key
6       x = x.left
7       else x = x.right
8   z.p = y
9   if y == T.nil
10      T.root = z
11  elseif z.key < y.key
12      y.left = z
12  else y.right = z
13  z.left = T.nil
14  z.right = T.nil
15  z.color = RED
17  RB-INSERT-FIXUP(T, z)

以上红黑树中插入新节点的过程与二叉搜索树中插入新节点的过程存在一下4点差别

  • 二叉搜索树中NIL在红黑树中使用T.nil代替

  • RB-INSERT中将z.left、z.right设置为T.nil,以保持树结构

  • 将z着为红色

  • 将z着为红色,可能违反红黑性质,调用RB-INSERT-FIXUP(T, z)保持红黑性质

RB-INSERT-FIXUP(T, z)
1   while z.p.color == RED
2       if z.p == z.p.p.left
3           y = z.p.p.right
4           if y.color == RED           // 情况1
5               z.p.color = BLACK       // 情况1
6               y.color = BLACK         // 情况1
7               z.p.p.color = RED       // 情况1
8               z = z.p.p               // 情况1
9           else if z == z.p.right      // 情况2
10              z = z.p                 // 情况2
11              LEFT-ROTATE(T, z)       // 情况2
12          z.p.color = BLACK           // 情况3
13          z.p.p.color = RED           // 情况3
14          RIGHT-ROTATE(T, z.p.p)      // 情况3
15      else(same as then clause with "right" and "left" exchanged)
16  T.root.color = BLACK

RB-INSERT-FIXUP操作。当z节点插入后,由于z和它的父节点z.p都是红色,违反了性质4。由于z的叔节点y是红色,执行情况1。节点被重新着色,并且指针z沿数上升。再一次z及其父节点都为红色,但z的叔节点为黑色,因为z为其父节点的右孩子,执行情况2,经过一次左旋,z变为其父节点的左孩子,应用情况3。重新着色执行一次右旋后变为一颗合法的红黑树

在这里插入图片描述

在调用RB-INSERT-FIXUP操作时,性质1、性质3、性质5是可以继续保持不被破坏。但性质2和性质4可能被破坏。因为我们加入的节点z是一个红色的并且带有黑色叶子节点的节点。但有可能只有z节点,z节点是红色的根节点,破坏性质2;也有可能z节点的父节点为红色破坏性质4

分析

一颗n个节点的红黑树高度为O(lgn),因此RB-INSERT的1~16行花费O(lgn)时间。RB-INSERT-FIXUP,仅当情况1发生,指针z沿树上升2层,while循环才会重复执行。while循环可能被执行的总次数为O(lgn).因此RB-INSERT总共花费O(lgn)时间。并且旋转从不超过两次,因为执行情况2或情况3,while循环就结束了

删除

在红黑树中删除一个节点需要花费O(lgn)时间。首先需要需要设计一个供RB-DELETE调用的子过程RB-TRANSPLANT

RB-TRANSPLANT(T, u, v)
1   if u.p == T.nil
2       T.root = v
3   elseif u == u.p.left
4       u.p.left = v
5   else u.p.right = v
6   v.p = u.p

RB-DELETE与TREE-DELETE类似,多出的几行代码记录节点y的踪迹,y可能导致红黑树性质的破坏。当要删除节点z,此时z的子节点少于2个时,z从树中删除,并让y成为z。当z有两个子节点时,y应该是z的后续,并且y将移至树中的z位置。在节点被移除或在树中移动前,必须记住y的颜色,并记录节点x的踪迹,将x移至树中y的原来位置,节点x也可能引起红黑性质的破坏。删除节点z之后,RB-DELETE调用辅助过程RB-DELETE-FIXUP,该过程改变颜色和执行旋转来恢复红黑性质

RB-DELETE(T, z)
1   y =  z
2   y-original-color = y.color
3   if z.left == T.nil
4       x = z.right
5       RB-TRANSPLANT(T, z, z.right)
6   elseif z.right == T.nil
7       x = z.left
8       RB-TRANSPLANT(T, z, z.left)
9   else y = TREE-MINIMUM(z.right)
10      y.original-color = y.color
11      x = y.right
12      if y.p == z
13          x.p = y
14      else RB-TRANSPLANT(T, y, y.right)
15          y.right = z.right
16          y.right.p = y
17      RB-TRANSPLANT(T, z, y)
18      y.left = z.left 
19      y.left.p = y
20      y.color = z.color
21      if y-original-color == BLACK
22          RB-DELETE-FIXUP(T, x)

RB-DELETE在包含TREE-DELETE逻辑基础上,添加了其他控制逻辑,两个过程的区别如下

  • 始终维持节点y为从树中删除节点或移至树内的节点。当z的子节点少于两个时,首先将y指向z,并移除。当z有两个子节点时,第9行代码将y指向z的后续,y将移至树中z的位置

  • 节点y的颜色可能改变,变量y-original-color存储发生改变前的y的颜色,当z有两个子节点时,y != z,节点y移至红黑树中节点z的原始位置。第20行给y赋予和z一样的颜色,我们需要保持y的原始颜色,以在RB-DELETE结束时判断是否需要修复红黑树,当y的原始颜色是黑色时,删除或移动y会引起红黑性质的破坏

  • 保存节点x的踪迹,使它移至节点y的原始位置上。第4、7和11行的赋值语句令x或指向y的唯一子节点或指向哨兵T.nil

  • 节点x移动到节点y的原始位置,x.p设置为指向树中y的原始节点的位置。如果z不是y的原始父节点,对x.p的赋值在RB-TRANSPLANT的第6行。当y的原始父节点为z时,我们不会将x.p设置为y的原始父节点z,因为z将被删除,节点y将在树中向上移动占据z的位置,第13行将x.p设置为y,使得x.p指向y父节点的原始位置

  • 如果节点y是黑色,可能会引入一个或多个红黑树性质被破坏的情况,在第22行调用RB-DELETE-FIXUP来恢复红黑树性质。如果y是红色,则删除或移动时,红黑性质仍然保持,原因有以下三点

    • 树的黑高没有变化

    • 不存在两个相临的红节点。y在树中占据了z的位置,再考虑到z的颜色,树中y的新位置不可能有两个相邻的红节点。如果y不是z的右孩子,则y的原右孩子x代替y。如果y是红色,则x一定是黑色,因此用x替代y不可能使两个红节点相邻

    • 如果y是红色,就不可能是根节点,所以根节点依然是黑色

节点y如果是黑色,会产生3个问题,可以通过RB-DELETE-FIXUP进行补救

  • y如果是原本的根节点,y的一个红色的孩子成为了新的根节点则违反了红黑树性质2

  • 如果x、x.p是红色,则违反了性质4

  • 在树中移动y将导致任何包含y的简单路径上黑节点个数少1,y的任何祖先都不满足性质5。改正这一问题的办法是将占有节点y原来位置的x视为还有一重额外的黑色。这样性质5成立,但x将不满足性质1

恢复搜索树的红黑性质

过程RB-DELETE-FIXUP提供恢复搜索树红黑性质功能

RB-DELETE-FIXUP(T, x)
1 while x != T.root and x.color == BLACK
2   if x == x.p.left
3     w = x.p.right
4     if w.color == RED
5       w.color = BLACK                                               // 情况1
6       x.p.color = RED                                               // 情况1
7       LEFT-ROTATE(T, x, p)                                          // 情况1
8       w = x.p.right                                                 // 情况1
9     if w.left.color == BLACK and w.right.color == BLACK
10      w.color = RED                                                 // 情况2
11      x = x.p                                                       // 情况2
12    else if w.right.color ==  BLACK
13      w.left.color = BLACK                                          // 情况3
14      w.color = RED                                                 // 情况3
15      RIGHT-ROTATE(T, w)                                            // 情况3
16      w = w.p.right                                                 // 情况3
17    w.color = x.p.color                                             // 情况4
18    x.p.color = BLACK                                               // 情况4
19    w.right.color = BLACK                                           // 情况4
20    LEFT-ROTATE(T, x.p)                                             // 情况4
21    x = T.root                                                      // 情况4
22  esle(same as then clause with "right" and "left" exchanged)
23 x.color = BLACK

将x视为还有一重额外的黑色,则将违反的性质5转换成x违反性质1。过程RB-DELETE-FIXUP将恢复性质1、性质2和性质4。第1~22行中while循环目标是将额外的黑色沿树上移,直到:

  • x指向红黑节点,此时在第23行将x着为单个黑色,去除掉额外的黑色

  • x指向根节点,此时可以简单移除额外的黑色

  • 执行适当的旋转和重新着色,推出循环

在while循环中,x总是指向一个具有双重黑色的非根节点,第2行中判断x是其父节点的左孩子还是右孩子,保持指针w指向x的兄弟。由于节点x是双重黑色,故w不可能是T.nil,否则从x.p至叶子w的简单路径上的黑节点个数就会小于从x.p到x的简单路径上的黑节点数。

情况1,x的兄弟节点w是红色

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-08B29kli-1628315743444)(image/红黑树修复情况1.png)]

情况1发生在节点x的兄弟节点w为红色时,因为w必须要有黑色子节点,可以改变w和x.p的颜色,然后对x.p做一次左旋而不违反红黑树任何性质。x的新兄弟节点是旋转之前w的某个子节点,其颜色为黑色,这样将情况1转换为情况2、3或4处理

情况2,x兄弟节点w为黑色,而且w的两个子节点都是黑色

在这里插入图片描述

情况2,w的两个子节点都是黑色。因为w也是黑色,所以从x和w上去掉一重黑色,使得x只有一重黑色而w为红色。为补偿从x和w中去掉的一重黑色,在原来是红色或黑色的x.p上新增一重黑色。将x.p作为新节点x来重复while循环。如果通过情况1进入情况2,则新节点x是红黑的,因为原来的x.p是红色。新节点x的color属性值为RED,在之后的循环测试条件终止。在第23行将新节点x着色为单一黑色

情况3,x的兄弟节点w是黑色,w左孩子是红色,w的右孩子是黑色

在这里插入图片描述

情况3发生在w为黑色且左孩子为红色、右孩子为黑色时。通过交换w和其左孩子w.left的颜色,然后对w进行右旋而不违反红黑树任何性质。现在新兄弟节点w时一个有红色右孩子的黑色节点,我们将情况3转换成情况4

x的兄弟节点w是黑色,且w的右孩子是红色

在这里插入图片描述

情况4节点x的兄弟节点w为黑色且w的右孩子为红色,通过进行某些颜色修改并对x.p做一次左旋,可以去掉x的额外黑色,从而使其变为单重黑色,不破坏红黑树的任何性质。将x设置为根后,当while循环测试其循环条件时,循环终止

分析

含n个节点的红黑树高度为O(lgn),不调用RB-DELETE-FIXUP,RB-ELETE过程的时间总代价为O(lgn)。在RB-DELETE-FIXUP中,情况1、3、4在各执行常数次颜色改变和至多3次旋转便终止。情况2执行时指针x沿树上升至多O(lgn)次,且不执行任何旋转。因此RB-DELETE-FIXUP要花费O(lgn)时间,因此RB-DELETE运行总时间为O(lgn)

JDK1.8的HashMap底层红黑树实现 今天看了小刘老师讲的红黑树,看完后茅塞顿开,受益匪浅,于是我打算写一篇博客记录一下今天所学,本文章大多来自小刘老师的笔记,以及部分自己的见解 什么是树 在学习红黑树之前,我们先来复习一下什么是树 **树(tree)**是一种抽象数据类型(ADT),用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点通过连接它们的边组成一个具有层次关系的集合。 把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 树有很多种,向上面的一个节点有多余两个的子节点的树,称为多路. 阅读详情

相关推荐

[JDK8下的HashMap类应用及源码分析] 数据结构、哈希碰撞、链表变红黑树

HashMap是一种基于数组和链表(或红黑树)的数据结构,它通过哈希函数将键映射到数组的一个位置,并在该位置存储一个键值对的节点。 HashMap的put方法在插入数据前,首先要计算键的哈希值(hash(key))和索引,然后在相应的位置插入或更新节点,如果节点数超过阈值(threshold),就会进行扩容(resize())或树化。 HashMap的get方法主要是根据键的哈希值和索引,找到对应的位置,然后遍历链表或红黑树,返回匹配的值。

Java 技术专栏,从入门到精通,熟悉企业级开发 2388

HashMap源码(JDK1.8)深度分析-红黑树(插入)

阅读本专栏需要了解HashMap底层数组+链表+红黑树的数据结构。 本文将红黑树的插入自平衡源码做了深入分析,结合图例、说明和源码解析,希望对读者理解红黑树和HashMap源码有帮助。

Mr.Z的专栏 2701

Qt Creator设计器里也能拖拽?5步将你的QML自定义控件变成可视化插件(Qt6.5+)

本文详细介绍了如何在Qt Creator设计器中实现QML自定义控件的可视化拖拽功能(Qt6.5+)。通过5个步骤,从构建可插件化的QML控件基础到部署插件到设计器环境,帮助开发者将自定义控件转化为设计器插件,提升团队协作效率。特别适合需要频繁调整UI样式的开发场景。

weixin_29214559的博客 172

红黑树概念及应用(c++)

红黑树概念及应用

weixin_45338913的博客 883

Spacedesk保姆级教程:用旧平板给Windows电脑当副屏,从安装到避坑一步到位

本文提供Spacedesk保姆级教程,教你如何将旧平板变成Windows电脑的副屏,从软件安装到网络配置、显示优化及声音交互,一步步避开常见陷阱。通过WiFi实现扩展屏功能,支持4K分辨率和60Hz刷新率,让闲置设备焕发新生。

weixin_42524945的博客 1万+

Ubuntu18.04 SoftRoCE安装教程

目标:创建两台Ubuntu18.04虚拟机,安装SoftRoCE环境,一台作为Server,一台作为Client,模拟RDMA通信环境,熟悉RDMA的通信方式。

GGGYL111的博客 1551

红黑树及其应用介绍(万字长文)

红黑树是一种特殊的二叉查找树,它遵循了特定的规则使得其具有了平衡性。红黑树在很多领域中都有广泛的应用,例如操作系统、数据库、图形学等。它的平衡性和高效的操作性能使得它成为一种非常优秀的数据结构。

sinat_30545761的博客 983

【深度学习新浪潮】手把手教你不花一分的token钱,纯本地部署openclaw

本地轻量开源AI智能体框架Windows 11 + WSL2 + Ollama + OpenClaw 一键部署零代码配置,直接用上本地模型工具调用未来方向:轻量化、插件化、本地生态成熟如果你喜欢本地AI、厌倦了云端限制、想真正拥有一个“听话又能干”的本地助手,OpenClaw 绝对值得现在就上手玩一玩。

专注:太空算力、AI infra、异构调度、大模型成本工程 2786

红黑树介绍和示例,以及在linux内核中的一些应用

红黑树的自平衡特性确保了定时器事件的高效处理,提高定时器查找和触发的效率。每个运行中的进程都有一个进程控制块(进程描述符struct task_struct),这些块通过红黑树进行组织和调度,进程们都在进程调度器的红黑树中维护一个节点,通过对红黑树进行适当的旋转和平衡,这样可以根据进程的优先级和其他因素轻松地查找和选择下一个要运行的进程。虽然红黑树的查找操作在平均情况下具有较好的性能(O(log n)),但对于大量的读取操作而言,与无序数组相比,它可能有较高的性能开销,因为它需要维护平衡。

szqy00的博客 2011

CUDA:实现使用cuSolverSP底层API实现Cholesky因式分解(附完整源码)

CUDA:实现使用cuSolverSP底层API实现Cholesky因式分解(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 350

华为od 面试八股文_Python_05_含答案

华为od 面试八股文_Python_05_含答案

MISAYAONE的博客 2569

理解红黑树之JDK源码应用

一、红黑树的介绍 算法导论对红黑树的介绍: 红黑树,一种二叉查找树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的 二、红黑树的性质 每个结点要么是红的,要么是黑的。 根结点是黑的 定义NULL为黑色 如果某个子结点是红色的,那么它的两个儿子都...

q865165648的博客 372

openwrt之luci通信原理(一)

从模板中分离,每个LuCI2子页面也需要一个定义并存放在/www/luci2/view/目录下的一个视图,视图是使用了子页面特定对象的L.ui.view扩展的JavaScript文件。有一点需要注意的是需要提供execute方法,创建视图失败有几种原因,特别是当它需要ubus加载额外的数据使用的时候。所以在execute方法中提供成功或者失败的信息是有意义的。不幸的是在异步方法加载特定数据的时候,不能简单的返回true或false,解决的方法是返回一个Promise对象来运行推迟提供是否成功的信息。

1150

Java源码阅读之红黑树在HashMap中的应用 - JDK1.8

阅读优秀的源码是提升编程技巧的重要手段之一。 如有不对的地方,欢迎指正~ 转载请注明出处https://blog.lzoro.com。 前言 基于JDK1.8。 JDK1.8之前,HashMap并没有采用红黑树,所以哈希桶上的链表过长时,就会有效率问题。 JDK1.8,则在HashMap引入了红黑树,当链...

weixin_34214500的博客 210

盲孔、埋孔、通孔、一阶HDI、二阶HDI概念

文章目录1. 盲孔和埋孔2. 一阶、二阶HDI3. PADS软件设置盲埋孔 1. 盲孔和埋孔 HDI板是高密度互连(High Density Interconnector)的缩写,是生产印制板的一种技术,使用微盲埋孔技术的一种线路分布密度比较高的电路板,也被称为盲埋孔板,下图就是一个6层HDI板,其中C和D就是盲孔,B是埋孔,A是通孔。 盲孔(Blind Via)指连接外层到内层的金属化孔,D是V13孔,连接顶层和第3层,C是V56孔,连接第5层和底层。 埋孔(Buried Via)指连接内层到内层的金属

记得诚 3万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

JDK底层应用最多的 红黑树

红黑树可以提高搜索性能,解决二叉搜索树的弊端 学习红黑树 之前必须懂二分查找、数据结构中的二叉树、二叉搜索树、平衡二叉树等概念 我在 [数据结构与算法——Java落地(考研求职必学)](https://blog.youkuaiyun.com/zhj52666/article/details/107966228)一文中 给出了这些理论多地的java代码下载地址、大家可以自行查阅。

zhj52666的博客 474

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

HashMap 数据结构之红黑树, 红黑树在什么时候左旋 右旋 如何旋转

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 树是数据结构中经典的结构之一,也是面试中常问的面试题之一,最近复习了一个红黑树的知识,做一下整理 文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 ...

huqiankunlol的博客 4223

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Java面试必备:为什么JDK1.8对HashMap进行了红黑树的改动?

HashMap是Java集合框架中最常用的数据结构之一,它以键值对的形式存储数据,提供了高效的插入、删除和查找操作。在JDK1.8中,HashMap的实现经历了一个重要的改进:当链表长度超过阈值时,会将链表转换为红黑树。这一改动显著提升了HashMap在极端情况下的性能。本文将详细探讨这一改动的原因、实现细节以及带来的好处。

qq_58299462的博客 1106

jdk8 HashMap红黑树学习

数据结构 jdk7内部数据结构为数组+链表,通过key的hash值计算数据所在数组下标,多个key的hash相同或hash计算的数组下标相同,但是key值不同时,往链表尾追加Entry。 transient Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_TABLE; static class Entry<K,V> ...

曾舜尧的专栏 2878

学习红黑树后学习记录

学习目录: 一、红黑树理论讲的很好的一篇漫画图解博客 二、为什么会出现红黑树 三、红黑树特性 四、红黑树的插入和删除,看这篇博客就可以了 五、红黑树的应用 六、总结 一、红黑树理论讲的很好的一篇漫画图解博客 https://www.sohu.com/a/201923614_466939 二、为什么会出现红黑树 红黑树用于解决二叉搜索树查询时的最坏时间复杂度...

weixin_30832143的博客 123

JDK1.8 HashMap$TreeNode.balanceInsertion 红黑树平衡插入

红黑树介绍 1.节点是红色或黑色。 2.根节点是黑色。 3.每个叶子节点都是黑色的空节点(NIL节点)。 4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点) 5.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点 JDK1.8 HashMap$TreeNode.balanceInsertion 红黑树平衡插入 转载于:https://www.cn...

weixin_30826761的博客 109

红黑树

一 红黑树的特点 1.节点是红色或黑色。 2.根节点是黑色。 3.每个叶子节点都是黑色的空节点。 4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点) 5.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。 总结 1 节点是黑红 2 根黑 3 叶子黑 空 4 2个红不能挨着 5 根到叶子的路径黑数量都相同 ...

有趣的难受 170

红黑树及其实例JDK中的TreeMap

  红黑树是一种自平衡二叉查找树(binary search tree,BST),红黑树是一种比较复杂的数据结构,红黑树查找、插入、删除元素的时间复杂度为O(log n),n是树中元素的数目.文章的要讲的知识点如下:   一、红黑树的基本介绍     红黑树插入节点     红黑树删除节点   二、红黑树应用实例:Jdk中的TreeMap 一、红黑树的基本介绍    二叉查找树(bin...

weixin_30251587的博客 123

红黑树- 终究还是一个人抗下了所有

要学习红黑树先要了解二叉查找树(Binary Search Tree) 二叉查找树(BST)具备什么特性呢? 1.左子树上所有结点的值均小于或等于它的根结点的值。 2.右子树上所有结点的值均大于或等于它的根结点的值。 3.左、右子树也分别为二叉排序树。 下图中这棵树,就是一颗典型的二叉查找树: 这样的数据结构有什么好处呢?我们来试着查找一下值为10的节点 1.查看根节点9: 2.由于10 > 9,因此查看右孩子13: 3.由于10 < 13,因此查看左孩子11.

Zero_uou的博客 396

红黑树红黑树

123456789101112131415// 排序函数// 节点结构体...// 根节点指针// 记录红黑树中当前的节点个数显示详细信息。

木牛的博客 156

奈学:红黑树(RedBlackTree)的概述

AVL树与红黑树   AVL树是一种自平衡的二叉查找树,又称平衡二叉树。AVL用平衡因子判断是否平衡并通过旋转来实现平衡,它的平衡的要求是:所有节点的左右子树高度差不超过1。AVL树是一种高平衡度的二叉树,执行插入或者删除操作之后,只要不满足上面的平衡条件,就要通过旋转来保持平衡,而的由于旋转比较耗时,由此我们可以知道AVL树适合用于插入与删除次数比较少,但查找多的情况。   由于维护这种高度平衡所付出的代价可能比从中获得的效率收益还大,故而实际的应用不多,更多的地方是用追求局部而不是非常严格整体平衡的..

yuemuyi的博客 225
上一篇: 取物资问题
下一篇: nacos配置文件监听
炒栗子不加糖
博客等级 码龄10年 68粉丝 123原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值