TreeMap源码剖析:自定义排序规则的红黑树map数据结构

文章目录

  • 概述
  • 基本结构
  • 构造函数
  • 自定义排序实现
  • 维护红黑树性质
  • 小结

概述

Java中的TreeMap类实现了自定义排序规则的红黑树(Red-Black Tree)Map数据结构,它保证了键值对按照键的自然顺序或提供的比较器(Comparator)进行排序。TreeMap实现了NavigableMap接口的有序映射,它使用红黑树数据结构存储键值对。红黑树是一种自平衡的二叉查找树,它通过颜色标记和性质维持来确保树的平衡,从而保证了查找、插入、删除等操作的高效性(平均和最坏情况下时间复杂度为O(log n))。

基本结构

  • 成员变量TreeMap内部维护了一个根节点(root),用于指向红黑树的根;一个比较器实例(comparator),用于自定义排序逻辑;以及其他辅助变量如size(存储元素数量)、modCount(记录修改次数,用于快速失败机制)、entrySet(存储所有Entry的集合)等。

  • Entry节点TreeMap内部使用Entry类表示每个映射关系的节点,包含键(key)、值(value)、左子节点(left)、右子节点(right)、父节点(parent)以及颜色标志(color,使用布尔值表示红黑)。

Entry<K,V>内部类:代表红黑树中的节点,包含键、值、颜色、左右子节点和父节点等信息。
root:指向红黑树的根节点。
comparator:用于自定义键排序的比较器,如果没有提供,则使用键自身实现的Comparable接口进行排序。
size:记录树中节点的数量。
modCount:用于追踪结构修改的次数,用于迭代器的快速失败机制。

构造函数

  • 默认构造函数:默认情况下,如果未提供比较器,TreeMap会使用键的自然排序(通过实现Comparable接口)。

  • 带比较器构造函数:可以通过传递一个Comparator实例来指定自定义排序规则。

  • 从其他集合构造:可以从已有的MapSortedMap构造TreeMap,并继承或重新定义排序规则。

public TreeMap() {comparator = null;
}public TreeMap(Comparator<? super K> comparator) {this.comparator = comparator;
}

自定义排序实现

  • 比较器使用TreeMap在插入、删除和查找操作时,会调用comparator来比较键的顺序。如果键实现了Comparable接口且没有提供比较器,它将使用Comparable.compareTo()方法;如果提供了比较器,则使用Comparator.compare()方法。

  • 插入操作:插入操作(如put(K key, V value))涉及到了查找插入位置、创建新节点、调整树结构以维持红黑树性质的过程。核心在于putTreeVal()方法,它负责找到插入点,并调用balanceInsertion()来保持红黑树的平衡。

  • 删除操作:删除操作(如remove(Object key))较为复杂,需要处理多种情况,包括节点是叶节点、只有一个子节点或两个子节点的情况。删除后,通过balanceDeletion()方法调整树结构,确保红黑性质。

  • 查找操作:查找操作(如get(Object key))利用了红黑树的有序性,从根节点开始,根据键的比较结果选择左孩子或右孩子进行递归查找,直到找到目标节点或达到叶子节点。

维护红黑树性质

  • 颜色规则:红黑树通过节点的颜色标记来维持平衡,确保任何路径从根到叶子节点经过的黑色节点数量相同,从而保证最坏情况下的查询时间复杂度为O(log n)。

  • 旋转:包括左旋(rotateLeft())和右旋(rotateRight()),用于在插入或删除后重新平衡树。

  • 颜色翻转:改变节点及其子节点的颜色,用于调整红黑树的平衡。在某些情况下,仅通过颜色翻转(flipColors())即可恢复平衡,这通常发生在两个连续红色节点的情况。

插入和删除平衡调整:通过balanceInsertion()和balanceDeletion()方法,根据插入或删除后的具体情况进行相应的调整操作,包括颜色变化和旋转。

小结

TreeMap通过精心设计的算法和数据结构,实现了高效的自定义排序的键值对存储。用户可以通过提供比较器来自定义键的排序逻辑,使得TreeMap适用于需要保持键排序的场景,比如实现索引、范围查询等。源码中详细实现了红黑树的插入、删除、查找以及平衡调整逻辑,确保了数据结构的高效稳定运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/857800.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

苹果智能和人工智能最大化

苹果智能和人工智能最大化 除了苹果公司&#xff0c;还没有人真正使用过苹果的智能功能。它要到秋天才会分阶段发布&#xff0c;即使到那时&#xff0c;它也无法在80%或90%的iPhone安装基础上运行&#xff0c;因为它需要只有iPhone 15 Pro才能使用的设备上处理功能。没有什么能…

SurfaceView内存怎么销毁?

在Android中&#xff0c;SurfaceView是一个特殊的视图&#xff0c;用于处理高性能视频或图形渲染&#xff0c;通常与Camera或自定义动画等场景配合使用。由于SurfaceView涉及到硬件层的资源管理&#xff0c;因此销毁和重建过程需要特别注意以确保资源正确释放和避免内存泄漏。以…

养老护理实训室:制定一个完善的养老护理实训室建设方案

为职业院校建设养老护理实训室是非常有意义的&#xff0c;因为养老护理是一个重要且不断增长的领域&#xff0c;为学生提供相关实践机会可以增强他们的实际操作技能和为未来就业做好准备。以下是一个详细的建设计划&#xff0c;涵盖了实训室的设计、教学方法、设备配置等方面&a…

Mybatis MySQL allowMultiQueries 一次性执行多条语句

在JDBC 增加参数allowMultiQueries jdbc:mysql://localhost:3306/abc?&allowMultiQueriestrue <insert id"addRi" parameterType"java.util.List">DELETE FROM sys_ri WHERE sr_id #{roId} AND sr_fion_id #{fod};INSERT into sys_rVALUES&…

海南聚广众达电子商务咨询有限公司抖音电商新标杆

在数字经济的浪潮中&#xff0c;抖音电商正成为一股不可忽视的力量。海南聚广众达电子商务咨询有限公司&#xff0c;作为专注于抖音电商服务的领军企业&#xff0c;凭借其专业的团队和创新的思维&#xff0c;不断助力商家在抖音平台上实现商业价值的最大化。 海南聚广众达电子…

Github上传大于100M的文件(ubuntu教程)

安装Git-lfs Git Large File Storage (LFS) 使用 Git 内部的文本指针替换音频样本、视频、数据集和图形等大文件&#xff0c;同时将文件内容存储在 GitHub.com 或 GitHub Enterprise 等远程服务器上。官网下载&#xff1a;https://git-lfs.github.com/ ./install.sh上传 比如…

基于SpringBoot+Vue大学生网络教学平台设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…

JSON数据操作艺术

在现代Web开发和数据交换场景中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;作为一种轻量级的数据交换格式&#xff0c;扮演着至关重要的角色。它以易于阅读的文本形式存储和传输数据对象&#xff0c;而这些对象的核心便是由属性名&#xff08;键&…

LLC开关电源开发:第四节,LLC软件设计报告

LLC源代码链接 数控全桥LLC开发板软件设计报告  1. LLC硬件及软件框架2. LLC软件设计2.1 工程文件说明2.2 LLC中断设计2.2.1 20us中断2.2.2 5ms中断 2.3 LLC状态机设计2.3.1 初始化状态2.3.2 空闲状态2.3.3 软启动状态2.3.4 正常运行状态2.3.5 故障状态 2.4 环路设计2.4.1 环路…

比较Zig、Rust和C++

比较Zig、Rust和C这三种编程语言&#xff0c;我们可以从以下几个关键维度来进行&#xff1a; 设计理念 表格 语言 设计理念 Zig 简洁性、模块化、避免常见错误 Rust 内存安全、并发性、性能 C 性能优化、资源控制、可扩展性 内存安全 Zig通过严格的编译时检查、可选…

机器学习课程复习——逻辑回归

1. 激活函数 Q:激活函数有哪些? SigmoidS型函数Tanh 双曲正切函数

Nature Climate Change | 气候变暖会造成未来全球干旱区面积扩张?

在气候变暖的情况下&#xff0c;旱地通常被预测将在全球范围内扩大&#xff0c;旱地包括以水资源有限、植被稀疏为特征的土地区域。然而&#xff0c;这种预测依赖于旱地的大气代用物&#xff0c;即干旱指数。最近的研究表明&#xff0c;干旱指数对陆地水循环的各种组成部分的预…

设计模式1-简介

设计模式简介 专栏的目的什么是设计模式设计模式要学什么软件开发原则主流设计模式 学习建议经典面试题 资源 专栏的目的 1.理解松耦合的设计思想 2.掌握面向对象设计原则 3.掌握重构技法改善设计 4.掌握GOF核心设计模式 什么是设计模式 每一个模式描述了一个在我们周围不…

公共 IP 地址和私有 IP 地址的区别总结

什么是IP地址&#xff1f; IP 地址&#xff0c;即互联网协议地址&#xff08;Internet Protocol Address&#xff09;&#xff0c;是网络设备在网络中进行通信的标识。IP 地址可以看作是设备在网络中的“地址”&#xff0c;有助于数据包在网络中找到正确的接收端。IP 地址主要…

HTML(5)——列表表格

列表 无序列表 作用&#xff1a;布局排列整齐的不需要规定顺序的区域。 标签&#xff1a;ul嵌套il&#xff0c;ul是无序列表&#xff0c;li是列表条目 注&#xff1a;ul标签只能包裹li标签&#xff0c;li标签可以包含任何内容 有序列表 作用&#xff1a;布局排列整齐的需…

基于大型语言模型的全双工语音对话方案

摘要解读 我们提出了一种能够以全双工方式运行的生成性对话系统&#xff0c;实现了无缝互动。该系统基于一个精心调整的大型语言模型&#xff08;LLM&#xff09;&#xff0c;使其能够感知模块、运动功能模块以及一个具有两种状态&#xff08;称为神经有限状态机&#xff0c;n…

监控易产品升级动态:V7.6.6.15版本全面升级

随着信息技术的不断发展&#xff0c;企业对系统监控和数据管理的需求日益增加。为了满足广大用户的实际需求&#xff0c;监控易团队经过不懈努力&#xff0c;成功推出了V7.6.6.15版本&#xff0c;对产品进行了全面升级和优化。本次升级不仅增强了产品的稳定性和可靠性&#xff…

Vue: Module “vue“ has no exported member xxx

这个问题让我困扰了好一会儿&#xff0c;我询问了 chatgpt 和各种网站社区&#xff0c;尝试了切换依赖的版本&#xff0c;清除缓存等等&#xff0c;依然没有解决 不过算是有心栽花花不开&#xff0c;无心插柳柳成荫&#xff0c;碰巧解决了&#xff0c;也不知道是不是这个原因&a…

Win11下安装VS2022失败的解决办法

前几天我把我的HP Z840的操作系统换成了Win11&#xff0c;在重装VS2022时遇到了麻烦&#xff0c;提示无法安装 Microsoft.VisualStudio.Devenv.Msi。 查看安装日志提示&#xff1a;Could not write value devenv.exe to key \SOFTWARE\Microsoft\Internet Explorer\Main\Featur…

getSelection限制选取范围

// 选择容器元素 const box document.queryselector(.box);// 监听选择事件 document.addEventListener(mouseup, (e) > {// 如果选择不在box内部&#xff0c;清除选择if (!box.contains(e.target)) {window.getSelection().removeAllRanges();} });// 监听键盘事件&#x…