第 3 篇:有序的世界:有序表 (TreeMap/TreeSet) 的概念与优势
上一篇我们探讨了哈希表如何以牺牲顺序为代价换取极致的平均速度。然而,在现实世界的许多应用中,数据的有序性不仅是锦上添花,甚至是核心需求。想象一下:
- 你需要显示一个按价格排序的商品列表。
- 你需要找到某个时间点之前或之后的所有日志。
- 你需要维护一个实时更新的积分排行榜。
在这些场景下,哈希表的“无序”特性就显得力不从心了。这时,我们就需要请出另一类重要的数据结构——有序表 (Ordered Table)。
什么是有序表?超越简单排序的“智能书架”
有序表,顾名思义,是一种在使用层面上始终保持其内部元素(根据元素的键 Key)有序的集合结构。与哈希表不同,它不仅仅是存储数据,更是在存储的同时维护了数据之间的顺序关系。
你可以把它想象成一个“智能书架”:
- 自动排序: 无论你何时放入一本新书(数据),书架总能自动根据书名(键)的字母顺序,把它放在正确的位置。
- 快速定位: 你想找书名以“Java”开头的书,书架能很快帮你定位到那个区域。
- 轻松找到邻居: 你想找某本书前面或后面的那本书,也能轻松做到。
核心价值:有序性带来的超能力
有序表的核心价值在于其内在的有序性。这种有序性赋予了它一系列哈希表无法比拟的、强大的功能:
-
有序遍历 (Ordered Iteration): 这是最基本的能力。你可以轻松地按照键的自然顺序(从小到大)或指定的比较器顺序来遍历所有元素。这对于需要按顺序展示或处理数据的场景至关重要。
- 例子: for (Map.Entry<K, V> entry : treeMap.entrySet()) { ... } 遍历出来就是有序的。
-
范围查询 (Range Queries): 高效地查找出所有键在某个指定范围 [startKey, endKey] 内的元素。
- 例子: 在电商网站找出价格在 100 到 200 元之间的所有商品。TreeMap 提供了 subMap(fromKey, toKey) 等方法来支持这类操作。
-
邻近查找 (Neighbor Finding): 快速找到与给定键 K “最接近”的元素,这对于需要上下文关联的操作很有用。
- floorKey(K): 找到小于等于 K 的最大键(“地板”)。
- ceilingKey(K): 找到大于等于 K 的最小键(“天花板”)。
- firstKey(): 找到最小的键。
- lastKey(): 找到最大的键。
- 例子: 找到某个分数对应的排行榜名次(可能需要 floorKey 或 ceilingKey 来定位)。
性能承诺:稳定可靠的 O(log N)
为了高效地支持上述有序操作,同时还要保证插入、删除、查找这些基本操作也足够快,有序表的底层实现(我们后面会详细介绍几种)通常采用了精巧的自平衡 (Self-Balancing) 机制。这些机制确保了无论数据如何插入删除,结构都不会变得极端不平衡(比如退化成链表),从而将主要操作的时间复杂度稳定地维持在 O(log N)。
O(log N) 是一个非常优秀的复杂度。即使数据量从百万增长到十亿(增长 1000 倍),操作时间可能只需要增加大约 10 倍 (log2109 ≈ 30, log2106 ≈ 20),性能增长非常平缓。
Java 中的体现:TreeMap 与 TreeSet
Java 集合框架为我们提供了有序表的标准接口和实现:
-
java.util.TreeMap<K, V>:
- 基于红黑树 (Red-Black Tree) 实现的有序 Map。
- 它存储键值对,并根据 Key 的自然顺序(Key 类需要实现 Comparable 接口)或者在创建 TreeMap 时传入的Comparator 来排序。
- 提供了所有 Map 的基本操作 (put, get, remove, containsKey),以及上述的有序特性操作 (firstKey, lastKey, floorKey, ceilingKey, subMap 等)。
- 所有这些核心操作的时间复杂度都是 O(log N)。
- 它是线程不安全的。需要线程安全且有序的 Map 可以考虑 java.util.concurrent.ConcurrentSkipListMap。
-
java.util.TreeSet<E>:
- 基于 TreeMap 实现的有序 Set。它只存储唯一的元素,并保持元素的有序性。
- 可以看作内部使用了一个 TreeMap,其中元素作为 Key,Value 是一个固定的虚拟对象。
- 提供了 Set 的基本操作 (add, remove, contains),以及类似 TreeMap 的有序操作 (first, last, floor, ceiling, subSet 等)。
- 所有核心操作的时间复杂度也是 O(log N)。
- 同样是线程不安全的。需要线程安全且有序的 Set 可以考虑 java.util.concurrent.ConcurrentSkipListSet。
底层实现的多样性 (重要提示):
需要强调的是,TreeMap 和 TreeSet 在 Java 标准库中是用红黑树实现的。但“有序表”本身是一个概念模型或接口。理论上,任何能保证 O(log N) 性能并维护有序性的数据结构都可以作为有序表的底层实现,例如:
- AVL 树
- SB 树 (Size Balanced Tree)
- 跳表 (Skip List)
我们后续会探讨这些不同实现之间的细微差别和选型考量。
一句话选型总结 (有序表概念)
有序表 (TreeMap/TreeSet): 当你需要在 O(log N) 时间内进行增删改查,并且必须维护元素顺序,或需要执行范围查找、查找邻近元素等操作时,选择有序表。
实际项目思考 (Java)
- 用户积分排行榜: 使用 TreeMap<Integer, List<Long>> (分数 -> 用户ID列表) 或 TreeSet<UserScore> (自定义 UserScore 对象,实现 Comparable 或提供 Comparator 按分数排序)。可以方便地添加/更新分数,并快速查找 Top N 或某个用户的排名。
- 配置管理系统: 如果配置项需要按某种 key (如字母顺序) 展示或查找,TreeMap<String, String> 是不错的选择。
- 时间序列数据索引: 需要根据时间戳快速查找某个时间点之前/之后或某个时间段内的数据。使用 TreeMap<Timestamp, DataObject>。
- 实现简单的 Rate Limiter (基于时间窗口): 记录请求的时间戳,需要快速清理过期的时间戳(找到窗口开始时间之前的记录)。TreeSet<Long> 或 TreeMap 可以辅助实现。
有序表是处理需要排序或范围查询场景的得力助手。但请记住,它的 O(log N) 性能依赖于底层实现的平衡机制。下一篇,我们将快速回顾一下为何需要“平衡”,为理解红黑树等具体实现打下基础。
相关文章:
第 3 篇:有序的世界:有序表 (TreeMap/TreeSet) 的概念与优势
上一篇我们探讨了哈希表如何以牺牲顺序为代价换取极致的平均速度。然而,在现实世界的许多应用中,数据的有序性不仅是锦上添花,甚至是核心需求。想象一下: 你需要显示一个按价格排序的商品列表。你需要找到某个时间点之前或之后的…...
VulnHub-DC-2靶机
主机发现 sudo arp-scan -l 以sudo管理员权限扫描本地活动ip地址 Interface: eth0, type: EN10MB, MAC: 08:00:27:22:46:4f, IPv4: 192.168.252.230 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.252.6 4c:5f:70:74:3c:3b …...
论文笔记(八十三)STACKGEN: Generating Stable Structures from Silhouettes via Diffusion
STACKGEN: Generating Stable Structures from Silhouettes via Diffusion 文章概括摘要I. INTRODUCTIONII. 相关工作A. 从直觉物理学学习稳定性B. 用于姿态生成的扩散模型C. 自动化顺序装配 III. 方法A. 用于 S E ( 3 ) SE(3) SE(3)积木姿态生成的扩散模型B. 模型架构C. 数据生…...
论文阅读笔记——TesserAct: Learning 4D Embodied World Models
TesserAct 论文 采用RGB-DN(RGB深度法线) 作为 4D 场景中间表示,由此建模 4D 场景,比纯 2D 视频更准确地建模 3D 几何结构。相比现有的 4D 视频生成,优化速度快,收敛好,且首次从当前帧和文本描述…...
变转速振动信号分析处理与故障诊断算法模块
变转速振动信号分析处理与故障诊断算法模块,作为信号处理算法工具箱的主要功能模块,形成了以变转速振动信号分析处理与故障诊断算法模块的经典算法模型,可应用于各类关键机械部件(轴承、齿轮、转子等)的信号分析、故障…...
每日算法-250502
每日算法 - 2025.05.02 记录一下今天刷的几道 LeetCode 算法题。 3191. 使二进制数组全部等于 1 的最少操作次数 I 题目 思路 贪心 解题过程 遍历数组 nums。当我们遇到 nums[i] 时: 如果 nums[i] 是 1,我们不需要进行操作,因为目标是全 …...
如何在纯C中实现类、继承和多态(小白友好版)
基本实现原理 /* 通过结构体函数指针模拟类 */ typedef struct {// 成员变量int x; // 成员方法(函数指针) void (*print)(void* self); } MyClass;/* 成员函数实现 */ void my_print(void* self) {MyClass* obj (MyClass*)self;p…...
AE/PR插件 转场创建大师专业版 Transition Master Pro v2.0.2 Win+使用教程
Transition Master Pro v2.0.2是一款原生转场插件,专为Adobe Premiere Pro和After Effects设计。它提供了创建、导出和销售自己的转场效果,或从一个庞大的转场预设库中选择。使用Transition Master Pro v2.0.2,您可以快速轻松地创建令人惊叹的…...
[Linux]从零开始的STM32MP157 Buildroot根文件系统构建
一、前言 在前面的教程中,教了大家如何移植一个LInux的内核并且正确启动,我们发现Linux内核在启动后会出现一个错误,提示我们没有找到根文件系统。那么什么是根文件系统呢?之前我们使用Ubuntu编译了STM32MP157的TF-A,UBOOT,LINUX内…...
阿里云服务器 篇五(加更):短链服务网站:添加反垃圾邮件功能
文章目录 系列文章(可选)更新YOURLS版本安装 Compliance 插件安装 Phishtank-2.0 插件(可选)安装 httpBL 插件样例网站(不推荐)使用谷歌解决方案更多系列文章 阿里云服务器 篇一:申请和初始化 阿里云服务器 篇二:搭建静态网站 阿里云服务器 篇三:提交搜索引擎收录 阿…...
状压 DP 详解
文章目录 简介做法洛谷 P1171 简介 状压 DP 其实约等于一个 DP 的小技巧,一般应用在处理一个或多个集合的问题中(因为状压 DP 的下标就是一个集合),而且在 n n n 太大的时候建议不要使用这种方法。(如果你不懂&#…...
多模态大模型轻量化探索-视觉大模型SAM(Segment Anything Model)
往期,笔者基于LLava的数据对齐训练,搞了一个Reyes多模态大模型,并且看了些多模态大模型,相关开源的多模态大模型如:KimiVL、Internvl、QwenVL等,其视觉编码器的尺寸都比较大,如:Moon…...
数据分析_问题/优化
1 报表开发 1.1 数据问题 (1) 数据易错 问题描述 ①数据整合困难:数据来源多样、格式差异大,整合时处理不当易丢错数据. ②计算逻辑复杂:开发人员对复杂计算逻辑的理解产生偏差,会导致计算结果不准. 解决方案 ①建立数据标准,统一修正字段命名、数据类型、日期格式等 ②加强…...
我的stm32驱动电机驱动着突然就卡死程序死机了是为什么
电源不稳定或干扰 电机启动电流冲击:电机运行时可能导致电源电压跌落,影响STM32稳定性。需检查电源滤波电容、使用独立电源或增加稳压模块 地线干扰:电机与MCU共地时,高频噪声可能通过地线耦合,需采用隔离电路或磁耦芯…...
使用 Java 实现一个简单且高效的任务调度框架
目录 一、任务调度系统概述 (一)任务调度的目标 (二)任务调度框架的关键组成 二、任务状态设计 (一)任务状态流转设计 (二)任务表设计(SQL) 三、单机任…...
Git 完整教程:初学者分步指南
大家好,这里是架构资源栈!点击上方关注,添加“星标”,一起学习大厂前沿架构! Git 是一个分布式版本控制系统,可以帮助开发人员跟踪代码更改、与他人协作以及高效管理软件项目。无论您是初学者还是正在提升…...
数字智慧方案5856丨智慧环保综合解决方案(50页PPT)(文末有下载方式)
资料解读:智慧环保综合解决方案 详细资料请看本解读文章的最后内容。 随着城市化进程的加速和环境问题的日益严峻,智慧环保成为提升城市环境管理水平的重要手段。本文将对智慧环保综合解决方案进行详细解读,探讨其在实际应用中的需求、解决…...
VBA快速合并多列单元格
实例需求:工作表中第3行到第5行有如下图所示的数据表,为了方便展示,隐藏了部分列,实际数据为从C列到DO列。 现需要合并第3行和第4行相同内容的单元格,如第10行到第12行所示。 示例代码如下。 Sub MergeDemo()Dim dicM…...
区块链+IoT:创新场景落地背后的技术攻坚战
物联网(IoT)与区块链技术作为两大颠覆性技术,正通过深度融合推动各行各业的数字化转型。物联网通过连接海量设备实现数据互通与智能化管理,而区块链凭借去中心化、不可篡改和可追溯的特性,为物联网的安全性、隐私保护和…...
自动化测试项目2 --- 比特纵横 [软件测试实战 Java 篇]
目录 项目介绍 项目源码 库地址 项目功能测试 1. 自动化实施步骤 1.1 编写测试用例 1.2 自动化测试脚本开发 1.2.1 配置相关环境, 添加依赖 1.2.2 代码编写 2. 编写自动化脚本过程问题总结 2.1 Actons 方法的使用 2.2 等待的使用 2.3 页面操作 项目性能测试 1. 进…...
【学习笔记】深入理解Java虚拟机学习笔记——第1章 走进Java
第1章 走进Java 1.1 概述 Java成功的原因 1>一次编写到处运行 2>内存管理安全,自动回收 3>运行时编译 4>强大成熟的第三方库 1.2 Java技术体系 1>Java技术体系组成: -Java语言 -Java虚拟机实现 -class文件格式 -Java类库API -第三方J…...
JavaScript性能优化实战之运行时性能优化
在 JavaScript 开发中,运行时性能优化是确保网页响应迅速和流畅的重要环节。优化运行时性能不仅能提高用户体验,还能在高并发的情况下保证应用的稳定性。本文将细化几个常见的 JavaScript 运行时性能优化策略,帮助你提高代码执行效率。 1️⃣ 避免不必要的内存分配和释放 J…...
走进AI的奇妙世界:探索历史、革命与未来机遇
2022年11月30日,ChatGPT的横空出世像一枚深水炸弹,掀起了全球范围的AI狂潮。但这场革命并非偶然——它背后是80年AI发展史的厚积薄发。从图灵的哲学思辨到深度学习的技术突破,再到生成式AI的“涌现”时刻,AI正以惊人的速度模糊人机…...
用c 编写的笔记搜索程序
{XXX文本记录} 文本记录格式 xxx 搜索词条 #include <stdio.h> #include <string.h> #include <stdlib.h>int main(void){FILE *ffopen("help.txt","r");if(fNULL){perror("file");return -1;}char nr[2000];f…...
鼎讯信通 智能通信干扰设备:多频段多模态信号压制解决方案
在万物互联时代,通信安全已成为现代社会的核心基础设施防护重点。面对日益复杂的电磁环境挑战,新一代智能通信干扰设备通过技术创新实现了信号压制能力的革命性突破。本文将深入解析该设备的八大核心功能与技术特性,展现其在商业通信保障、工…...
软件测试概念
这里写目录标题 需求开发模型软件生命周期瀑布模型螺旋模型增量模型、迭代模型敏捷模型Scrum 测试模型V模型W模型(双V模型) 需求 用户需求:没有经过合理的评估,通常就是一句话 软件需求:是开发人员和测试人员执行工作…...
数据库性能杀手与调优实践
目录 前言一、索引缺失引发的全表扫描灾难1.现象与影响2.优化策略 二、SELECT * 的隐性成本1.危害分析2.优化实践 三、分页查询的性能陷阱1.深度分页问题2.优化方案对比 四、执行计划分析方法论1.关键指标解读2.典型劣化模式识别 五、综合优化最佳实践总结 前言 在数据库应用开…...
初始化列表详解
1.类中包含以下成员,必须放在初始化列表位置进行初始化: 1. 引用成员变量 2.const成员变量 3. 自定义类型成员(且该类没有默认构造函数时 ) 2. 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关…...
【CVE-2025-1094】:PostgreSQL 14.15 SQL注入漏洞导致的RCE_ 利用代码和分析
目标 PostgreSQL 14.15BeyondTrust Privileged Remote Access (PRA) 和 Remote Support (RS) 软件受影响的版本:使用PostgreSQL 14.15及其版本的BeyondTrust产品Explain CVE-2025-1094 是 PostgreSQL 14.15 版本的 psql 交互式工具中发现的 SQL 注入漏洞。由于输入值的验证不…...
【验证技能】VIP项目大总结
VIP项目快做一段落了,历时一年半,也该要一个大汇总。 VIP简介 VIP开发流程 VIP难点 进程同步 打拍插入不同bit位宽数据问题。 动态升降lane VIP做的不好的地方和改进想法 各层之间交互 testsuite两端关键 所有层的实现架构不统一 VIP经验 ** 架构…...
MyBatis 参数处理全解析
在 Java 开发领域,MyBatis 作为一款优秀的持久层框架,凭借其简洁的设计和强大的功能,受到了广大开发者的青睐。而参数处理作为 MyBatis 中一个至关重要的环节,掌握好它能让我们更高效地使用 MyBatis 进行数据库操作。本文将全面深…...
【自然语言处理与大模型】使用Xtuner进行QLoRA微调实操
本文首先对Xtuner这一微调框架进行简单的介绍。手把手演示如何使用Xtuner对模型进行微调训练,包括数据准备、训练命令执行及训练过程中的监控技巧。最后,在完成微调之后,本文还将介绍如何对微调结果进行简单对话测试。 一、Xtuner微调框架 X…...
2023华为od统一考试B卷【二叉树中序遍历】
前言 博主刷的华为机考题,代码仅供参考,因为没有后台数据,可能有没考虑到的情况 如果感觉对你有帮助,请点点关注点点赞吧,谢谢你! 题目描述 思路 0.用Character数组存储树,index下标的左右…...
Midjourney 绘画 + AI 配音:组合玩法打造爆款短视频!
一、引言:AI 重构短视频创作范式 在某短视频工作室的深夜剪辑室里,资深编导正在为一条古风剧情视频发愁:预算有限无法实拍敦煌场景,人工绘制分镜耗时 3 天,配音演员档期排到一周后。而使用 Midjourney 生成敦煌壁画风格的场景图仅需 15 分钟,AI 配音工具实时生成多角色台…...
敏感词 v0.25.1 新特性之返回匹配词,修正 tags 标签
开源项目 敏感词核心 https://github.com/houbb/sensitive-word 敏感词控台 https://github.com/houbb/sensitive-word-admin 版本特性 大家好,我是老马。 敏感词以前在实现的时候,没有返回底层实际匹配的词,有时候问题排查非常耗费时间。 …...
【多线程】六、基于阻塞队列的生产者消费者模型
文章目录 Ⅰ. 生产者消费者模型的概念Ⅱ. 生产者消费者模型的优点Ⅲ. 基于阻塞队列的生产者消费者模型MakefileBlock_queue.hpptask.hpptest.cppⅣ. 如何理解提高了效率❓❓❓Ⅰ. 生产者消费者模型的概念 生产者消费者模型是一种常见的并发模式,用于解决生产者和消费者之间…...
解决Flutter项目中Gradle构建Running Gradle task ‘assembleDebug‘卡顿问题的终极指南
解决Flutter项目中Gradle构建Running Gradle task ‘assembleDebug‘卡顿问题的终极指南 前言 在开发Flutter应用时,经常会遇到Gradle构建卡在Running Gradle task assembleDebug阶段的问题。本文将分享如何通过配置华为云镜像和使用自定义脚本下载依赖的方法解决这些问题。…...
IntelliJ IDEA 保姆级使用教程
文章目录 一、创建项目二、创建模块三、创建包四、创建类五、编写代码六、运行代码注意 七、IDEA 常见设置1、主题2、字体3、背景色 八、IDEA 常用快捷键九、IDEA 常见操作9.1、类操作9.1.1、删除类文件9.1.2、修改类名称注意 9.2、模块操作9.2.1、修改模块名快速查看 9.2.2、导…...
从此,K8S入门0门槛!
前言 当你想要入门K8S的时候,往往会被各种概念搞的晕乎乎的,什么API Server,Scheduler,Controller manager,Etcd,Pod,Kubelet,kube-proxy,deployment…… 哪怕你使用了…...
vue2和vue3组件如何监听子组件生命周期
在 Vue 中监听子组件的生命周期是一个常见需求,但 Vue 官方并不直接推荐这么做,因为这会打破组件的封装性。但在**一些特定场景(如自动化监控、封装逻辑复用)**下仍是有意义的。 下面分别讲解 Vue 2 和 Vue 3 中如何监听 子组件的…...
如何用Python绘制两个圆之间的8条公切线
引言 在几何学中,两圆之间存在多种类型的公共切线。本文将通过Python代码演示如何绘制两个同心圆(半径分别为1.0和3.0)之间的8条公切线,并解释相关数学原理与代码实现细节。 环境准备 import matplotlib.pyplot as plt import …...
会话历史管理——持久化
需求场景推荐方案理由中小企业级应用,需复杂查询MySQL/PostgreSQL事务支持完善,开发成本低海量数据高并发写入Cassandra水平扩展性强,写入性能高非结构化历史数据快速检索MongoDB灵活存储,内置全文检索本…...
C++之IO流
目录 一、C语言的输入与输出 二、流是什么 三、CIO流 3.1、C标准IO流 3.2、C文件IO流 四、stringstream的简单介绍 一、C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取数据,并将值存放…...
maven install时报错:【无效的目标发行版: 17】
在很多次运行项目前的maven install时,我总是遇到无效的目标发行版: 17的问题,解决过之后就又忘了怎么解决,浪费了很多时间。。 今天把他总结一下,如图报错: 解决方法 注意: 如果只想解决这个项目的问题…...
开闭原则(OCP)
非常棒的问题!🔍 开闭原则(OCP, Open/Closed Principle)是软件设计的核心原则之一,下面我将从定义、意义、优劣分析、Python示例和结构图五个方面完整解析给你。 🧠 什么是开闭原则? 开闭原则&a…...
FHQ Treap
按值分裂 /* 按值x分裂Treap:将树u分裂为<x的树l和>x的树r */ void split(int u, int x, int& l, int& r) {if (!u) { l r 0; return; } // 空树直接返回if (t[u].val < x) { // 当前节点值<x,应放入左树l u; …...
题解传送门
做个算法分类,这样找特定算法的题目就方便多了23333 竞赛工具 【竞赛工具】——sublime text4 xcpc竞赛向配置教程 【竞赛工具】——vscode xcpc竞赛向配置教程 算法讲解 [算法学习]——通过RMQ与dfs序实现O(1)求LCA(含封装板子) [算法…...
ASP.NET MVC 入门与提高指南七
39. 量子安全通信与 MVC 应用保障 39.1 量子安全通信概念 量子安全通信基于量子力学原理,利用量子态的特性(如量子纠缠、量子不可克隆定理)来实现信息的安全传输。与传统加密方式相比,量子安全通信能够提供更高的安全性…...
Linux工作台文件操作命令全流程解析
全文目录 1 确认当前工作路径2 导航与目录管理2.1 关键命令2.2 逻辑衔接 3 文件基础操作3.1 创建 → 备份 → 重命名 → 清理3.2 文件查看和编辑3.3 文件链接3.4 文件diff 4 文件权限与所有权管理5 文件打包与归档6 参考文献 写在前面 shell是一种命令解释器,它提供…...
03 - spring security自定义登出页面
spring security自定义登出页面 文档 00 - spring security框架使用01 - spring security自定义登录页面02 - spring security基于配置文件及内存的账号密码 自定义登出页面 调整配置类WebSecurityConfig.java package xin.yangshuai.springsecurity03.config;import org.…...