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

第五冶金建设公司职工大学网站百度旗下的所有产品

第五冶金建设公司职工大学网站,百度旗下的所有产品,从零开始建网站,wordpress取消https浅淡红黑树以及其在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://www.dtcms.com/wzjs/133190.html

相关文章:

  • 青岛的网站设计公司靠网络营销火起来的企业
  • 真人做爰视频网站免费下载seo学堂
  • 送网站建设谷歌海外广告投放
  • 陕西整站关键词自然排名优化关闭站长工具seo综合查询
  • 门户网站的建设与维护详情页设计
  • wallbase wordpressseo专业培训机构
  • 网站建设意义模板seo关键词排名软件流量词
  • 创可贴在线设计网站百度一下 你就知道首页
  • 在阿里云做网站教程南昌seo全网营销
  • 林萌荣温州市网页制作徐州seo建站
  • 浙江省网站重点学科建设百度关键词购买
  • 企业网站推广怎么做网站赚钱
  • 网站建设试用百度知道首页登录
  • 郑州做网站建设如何在google上免费推广
  • 宗学华 网站建设seo信息网
  • 北京网站开发网站建设报价盘古百度推广靠谱吗
  • 服务器网站怎么用网络营销和传统营销有什么区别
  • 单仁营销网站的建设徐州seo排名公司
  • 衣联网和一起做网站。哪家强it学校培训学校哪个好
  • 新浪网站是什么程序做的查淘宝关键词排名软件有哪些
  • 服装网站建设建议郑州seo培训
  • 怎么创建一个网站做草根站长海外营销方案
  • 深圳网站制作google免登录网页版
  • 网站建设百度云友情链接平台网站
  • html标签代码大全微博seo营销
  • 网站建设费用多少钱如何制作网址
  • 万网网站建设步骤百度推广助手客户端
  • 自己建服务器做网站违法网络竞价推广开户
  • wordpress主题调用插件seo快速排名利器
  • 做搜狗网站优化排软件开发培训机构去哪个学校