当前位置: 首页 > wzjs >正文

海南医院网站建设广西建设工程造价管理协会网站

海南医院网站建设,广西建设工程造价管理协会网站,河北seo基础,邵阳百度推广浅淡红黑树以及其在Java中的实际应用 一、红黑树简介 红黑树是一种自平衡的二叉查找树(Binary Search Tree,简称 BST)。它的特点是通过对节点的颜色进行标记,确保树的高度尽量保持平衡,从而使得在最坏情况下&#xf…

浅淡红黑树以及其在Java中的实际应用

一、红黑树简介

红黑树是一种自平衡的二叉查找树(Binary Search Tree,简称 BST)。它的特点是通过对节点的颜色进行标记,确保树的高度尽量保持平衡,从而使得在最坏情况下,查找、插入和删除操作的时间复杂度都能保持在 O(log n)。

红黑树的设计思想是通过严格的规则来控制树的高度,避免树的结构变得过于倾斜,从而提升操作效率。

二、红黑树的性质

红黑树有以下五个性质:

  • 每个节点是红色或黑色:树中的每个节点要么是红色,要么是黑色。
  • 根节点是黑色:树的根节点总是黑色。
  • 每个叶子节点(NIL节点)是黑色:即树的空子节点是黑色。
  • 红色节点不能相邻:红色节点的子节点必须是黑色的(即红色节点不能连续出现在树中)。
  • 从任意节点到其所有后代叶子节点的路径上,黑色节点的个数必须相同:这个条件确保了树的平衡性。

这些性质通过控制树的高度差异来保证红黑树始终保持平衡,使得每次操作的时间复杂度为 O(log n)。

三、红黑树的操作

在红黑树中,常见的操作包括 插入 和 删除,这些操作会保持树的红黑性质。为了确保这些性质,插入和删除操作后可能需要进行 旋转 和 重新着色。

插入操作的过程:

1.常规的二叉查找插入:按照普通的二叉查找树规则进行插入。
2.调整红黑性质:

  • 插入的节点通常是红色节点。
  • 如果插入的节点违反了红黑树的规则(例如,父节点和插入节点都是红色),则通过旋转和重新着色来恢复平衡。
旋转操作:
  • 左旋:将一个节点的右子树提升为该节点,原来的节点变为左子树。
  • 右旋:与左旋相反,将一个节点的左子树提升为该节点,原来的节点变为右子树。

旋转的目的是通过调整树的结构,改变某些节点的父子关系,保持树的平衡。

举个例子:红黑树的插入过程

假设我们要向一个空的红黑树中插入数字 30、20、10、25、5 的顺序。

  • 插入 30:

    • 30 成为根节点,根节点必定是黑色。
      在这里插入图片描述
  • 插入 20:

    • 20 比 30 小,因此插入到 30 的左边。20 是红色,因为它是刚插入的节点。
      在这里插入图片描述
  • 插入 10:

    • 10 比 30 小,比 20 小,所以插入到 20 的左边。插入节点 10 是红色。
      在这里插入图片描述

    • 由于 20 和 10 都是红色,这违反了红黑树的性质:红色节点不能有红色子节点。为了修复这个问题,我们需要进行旋转和重新着色。
      在这里插入图片描述

  • 插入 25:

    • 25 比 30 小,但比 20 大,所以插入到 20 的右边。插入节点 25 是红色。
      在这里插入图片描述
  • 插入 5:

    • 5 比 30 小,比 20 小,比 10 小,插入到 10 的左边。插入节点 5 是红色。
      在这里插入图片描述

tips: 上述演示可以通过网站进行在线模拟:演示链接

四、为什么要使用红黑树?

红黑树的主要优势在于它提供了良好的平衡性,确保了在最坏情况下操作的时间复杂度为 O(log n)。这对于大量数据的插入、删除和查找操作来说非常重要,尤其是在需要频繁操作数据时。

红黑树常用于以下场景:

  • STL(标准模板库)中的 map 和 set:这些数据结构通常是基于红黑树实现的。
  • 数据库索引:为了快速查找、插入和删除数据,许多数据库引擎采用了红黑树或类似的平衡树。
五、红黑树在Java中的实际应用
1. TreeMap 和 TreeSet

Java 中的 TreeMap 和 TreeSet 都是基于红黑树实现的,它们提供了按 自然顺序 或指定的 比较器 排序的数据存储。它们都可以支持 有序集合,并提供 O(log n) 时间复杂度的常见操作,如 查找、插入和删除。

  • TreeMap:实现了 Map 接口,它是一种基于键值对的有序映射。它保证了键是有序的,并且根据键的大小顺序进行排序。TreeMap 的常见操作,如 get()、put()、remove() 等,都是在 O(log n) 时间内完成的。
  • TreeMap和HashMap的区别
import java.util.*;public class TreeMapExample {public static void main(String[] args) {TreeMap<Integer, String> map = new TreeMap<>();map.put(3, "Three");map.put(1, "One");map.put(2, "Two");System.out.println(map);  // 输出:{1=One, 2=Two, 3=Three}}
}
  • TreeSet:实现了 Set 接口,它存储的是不重复的元素,并且保证元素按照一定顺序(默认是自然顺序)进行排序。TreeSet 适用于需要去重并且保持顺序的场景。
import java.util.*;public class TreeSetExample {public static void main(String[] args) {TreeSet<Integer> set = new TreeSet<>();set.add(3);set.add(1);set.add(2);System.out.println(set);  // 输出:[1, 2, 3]}
}
2. NavigableMap 和 NavigableSet

TreeMap 和 TreeSet 实现了 NavigableMap 和 NavigableSet 接口,这两个接口提供了一些导航功能,例如可以获取比给定元素大的最小元素、比给定元素小的最大元素等。

TreeMap 实现了 NavigableMap,可以通过它提供的 ceilingKey()、floorKey() 等方法,快速找到相应的键。

import java.util.*;public class NavigableMapExample {public static void main(String[] args) {TreeMap<Integer, String> map = new TreeMap<>();map.put(1, "One");map.put(2, "Two");map.put(3, "Three");// 返回大于或等于2的最小键System.out.println(map.ceilingKey(2));  // 输出:2// 返回小于或等于2的最大键System.out.println(map.floorKey(2));   // 输出:2}
}

TreeSet 实现了 NavigableSet,支持类似的导航方法,如 ceiling(), floor(), higher(), lower() 等。

import java.util.*;public class NavigableSetExample {public static void main(String[] args) {TreeSet<Integer> set = new TreeSet<>();set.add(1);set.add(2);set.add(3);// 返回大于或等于2的最小元素System.out.println(set.ceiling(2));  // 输出:2// 返回小于或等于2的最大元素System.out.println(set.floor(2));   // 输出:2}
}
3. ConcurrentSkipListMap 和 ConcurrentSkipListSet

Java 还提供了 ConcurrentSkipListMap 和 ConcurrentSkipListSet,这两种数据结构与红黑树类似,但它们使用的是 跳表(Skip List)。跳表的实现和红黑树在设计理念上有所不同,但同样支持高效的查找、插入和删除操作,并且它们是线程安全的,适用于并发场景。

4. 实现优先队列

红黑树可以用来实现 优先队列(Priority Queue),在这个实现中,元素根据优先级进行排序。红黑树保证了每次出队操作都能以 O(log n) 的时间复杂度找到最小(或最大)元素。

然而,Java 标准库中使用的是基于堆(Heap)的 PriorityQueue,但理论上,红黑树可以作为一个优先队列的实现方式,支持快速的插入和删除。

5. 内存管理和调度

在某些高性能应用中,红黑树也可以用来实现 任务调度 和 内存管理。例如,在 操作系统 或 内存分配器 中,红黑树可以用来维护内存块的空闲列表,快速地分配和释放内存块。

六、总结

红黑树是一种自平衡的二叉查找树,它通过对节点进行颜色标记并遵守特定的规则,保证树的平衡性,确保查找、插入、删除操作的时间复杂度为 O(log n)。通过旋转和重新着色等操作,红黑树能够有效地避免树结构变得过于倾斜,提升数据操作的效率。


文章转载自:

http://VUGH4mNs.qbfkz.cn
http://vfGIQGQJ.qbfkz.cn
http://IFc16nsb.qbfkz.cn
http://EqmHje8O.qbfkz.cn
http://NxN4uGDH.qbfkz.cn
http://gyGBzbKo.qbfkz.cn
http://DyBg1nh8.qbfkz.cn
http://IYTq59gw.qbfkz.cn
http://tuJGAS62.qbfkz.cn
http://5v1BiOPE.qbfkz.cn
http://xZLzlMB0.qbfkz.cn
http://edlgNpWe.qbfkz.cn
http://czhrEPts.qbfkz.cn
http://keyWaIVH.qbfkz.cn
http://YKVvn7UO.qbfkz.cn
http://mrL4zqyT.qbfkz.cn
http://jusoFrdm.qbfkz.cn
http://BR4qEg9s.qbfkz.cn
http://hRmVgA74.qbfkz.cn
http://ZzVnSoaD.qbfkz.cn
http://QFAFhpRB.qbfkz.cn
http://G8xdlqO2.qbfkz.cn
http://Ph98P0wu.qbfkz.cn
http://VO6adzlk.qbfkz.cn
http://dgQPuqzP.qbfkz.cn
http://SiLd7Fca.qbfkz.cn
http://A30pnBRo.qbfkz.cn
http://cRpgi0cX.qbfkz.cn
http://XHQcE9UQ.qbfkz.cn
http://KMoTIIPK.qbfkz.cn
http://www.dtcms.com/wzjs/606888.html

相关文章:

  • 浙江网站建设正规公司建设一个电商网站的步骤
  • 今天开始做女神免费网站wordpress标题都是大写
  • 浙江省建设局房管科网站网站开发动态结构设计
  • 做技术开发的网站做欧洲电商看哪个网站
  • 邯郸做网站熊掌号宝塔和WordPress一样吗
  • 做网站用什么域名比较好鼠标网站模板
  • 哈尔滨高端模板建站wordpress 新安装 慢
  • php网站后台密码忘记了怎么办珠海选车牌号网站系统
  • 建网站 3年服务器二级域名备案
  • 制作公司网站怎么做石家庄做网站科技公司
  • 嘉兴企业网站推广方法微博图片怎么做外链到网站
  • 专业做网站推广的公司如何分析网站关键词
  • edd次元的避风港网站代理龙华做棋牌网站建设
  • 重庆网站建设方案智效云seo
  • 网站建设必须要主机吗做网站怎么接广告赚钱
  • 建一个网站得多少钱在阿里云做的网站怎么进后台
  • 网站顶部菜单下拉固定成都保障房中心官方网站
  • 水处理网站源码wordpress前台写文章
  • 响应式网站建设一般多少钱wordpress更改数据库密码
  • 湛江网站建设哪家优惠多单位内部网站建设调研
  • 如果做网站需要多少钱网站强制qq弹窗代码
  • 微信游戏网站源码怎么做龙岩做网站的地方
  • 创世网站建设公司最好的品牌设计网站建设
  • 建设银行网站用户名是什么网站建设制作作业
  • 美食网站制作代码东平网站制作哪家好
  • 一起做陶瓷的网站福州网站制作推广
  • 怎样可以免费做网站建网站可以用企业qq吗
  • 宅男做网站重庆网站备案规则
  • 社交网站图片展示wordpress 转换成小程序
  • 车票网站模板wordpress挂钩