数据结构
文章平均质量分 92
lifallen
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
树形 DP 与 DSU on Tree
本文比较了树形DP和DSU on Tree两种处理树上信息复用的方法。树形DP通过小状态转移在O(n)时间内解决问题,适用于可合并的小状态问题(如距离统计)。DSU on Tree则通过复用大容器和轻重链分解,以O(n log n)复杂度处理需要维护大状态的子树查询(如频次统计)。文章还分析了两种方法的核心思想、适用场景和复杂度,并提供了具体实现示例,特别讨论了换根DP中不可逆操作的处理技巧。原创 2026-02-28 20:33:38 · 569 阅读 · 0 评论 -
树的线性化
本文介绍了树的线性化技术,主要包括两种方法:DFS入序(tin/tout)和欧拉游历(Euler Tour)、重链剖分。DFS入序将子树映射为连续区间,适用于子树查询和修改操作;欧拉游历通过记录访问序列,支持LCA查询和树上莫队等应用。文章详细阐述了两种方法的实现原理、应用场景和典型例题,并提供了Java代码示例。关键在于根据问题类型(子树、路径或前缀路径)和运算性质(可消去或不可逆)选择合适的线性化方法。原创 2026-02-28 20:33:32 · 680 阅读 · 0 评论 -
后缀数组 (Suffix Array)
后缀数组是处理字符串匹配、去重、搜索等高级问题的利器,主要应用于: 大模型数据清洗:精确去重和防污染 DNA序列比对 代码克隆检测和子串检索 数据压缩:如bzip2算法 核心组件包括: SA数组:存储排序后的后缀索引 Rank数组:记录每个后缀的排名 Height数组:计算最长公共前缀(LCP) 关键应用场景: 模式匹配(O(MlogN)) 最长重复子串(Height数组最大值) 本质不同子串统计 构建方法采用倍增法(O(NlogN)),配合Kasai算法(O(N))计算Height数组。原创 2026-02-20 20:43:59 · 669 阅读 · 0 评论 -
莫队算法 (Mo‘s Algorithm)
莫队算法是一种基于分块思想的离线查询优化算法,通过合理排序查询顺序来最小化指针移动距离。核心思想是利用相邻查询间的重叠区间,通过移动左右端点逐步计算答案。算法将数组分块后,按块排序查询,使L指针在块内小范围移动,R指针大范围扫描。采用奇偶优化可进一步减少指针移动距离,复杂度最优可达O(N√M)。模板包含分块排序、指针移动和答案更新逻辑,支持处理区间统计问题。带修莫队则引入时间维度,支持动态修改场景。该算法适用于可增量维护的区间查询问题,是优雅暴力优化的典型范例。原创 2026-02-18 13:22:31 · 1078 阅读 · 0 评论 -
回文树 (Palindrome Tree / PAM)和AC自动机
回文树(PAM)是一种高效处理回文串问题的数据结构,相比Manacher算法能解决更复杂的问题。其核心由奇偶两棵回文树和Fail指针组成,通过动态构建方式维护字符串的回文信息。主要功能包括统计本质不同回文串数量、计算各回文串出现次数以及支持动态追加字符。构建过程通过寻找最长回文后缀并建立新节点,利用Fail指针实现快速跳转。典型应用场景包括回文串统计、回文划分等,时间复杂度为线性。原创 2026-02-18 10:49:46 · 630 阅读 · 0 评论 -
笛卡尔树 (Cartesian Tree)
笛卡尔树是一种兼具二叉搜索树和堆性质的二叉树,它能将数组下标与数值大小建立映射关系。其核心价值包括:1)将区间最值查询(RMQ)转化为最近公共祖先(LCA)问题;2)高效解决直方图最大矩形等"左右延伸"类问题;3)揭示Treap平衡树的本质。通过单调栈可实现O(N)线性构建,相比单调栈能持久化结构关系,支持树形DP等高级操作。笛卡尔树还是实现理论最优RMQ算法(O(N)预处理+O(1)查询)的关键桥梁,通过转化为LCA问题再转为±1 RMQ问题来实现。原创 2026-02-15 22:07:13 · 726 阅读 · 0 评论 -
LRU (Least Recently Used) - 空间换时间的极致平衡
本文深入探讨了LRU(最近最少使用)缓存算法的核心原理与实现。文章首先分析了LRU的核心需求:快速查找、快速更新和维护使用顺序的数据结构。通过对比数组、链表和优先队列的优缺点,指出哈希表+双向链表组合在性能上的优势。 重点解析了双向链表的必要性,强调其O(1)时间复杂度的操作特性。文章还揭示了LRU设计中的关键思想:索引与数据分离,以及空间换时间的权衡。提供了Java实现代码示例,并进一步探讨了带TTL(生存时间)的LRU扩展实现,包括固定TTL和不固定TTL两种情况的处理策略。原创 2026-02-14 14:34:07 · 622 阅读 · 0 评论 -
线段树 (Segment Tree) 完全指南
线段树(Segment Tree)是一种对线性空间的"二进制拆分"思想。如果说前缀和是利用了加法的逆运算,那么线段树就是利用了结合律的终极武器。线段树的本质是分治法(Divide and Conquer)在空间上的持久化。结合律意味着计算顺序可以被改变,从而允许我们将线性的计算重组为树形结构。如果直接操作不满足结合律(如"求众数"),就需要构造更复杂的信息结构使其满足(如摩尔投票法的合并)。所有的线段树高级技巧(Level 1-6),本质上都是在寻找或构造这个结合律。原创 2026-02-12 11:56:04 · 1060 阅读 · 0 评论 -
从Apache Doris 学习 HyperLogLog
HLL类实现了HyperLogLog算法,用于大数据集基数估算。该算法通过概率统计原理,在极小内存消耗下准确估算不同元素数量。核心设计包含四种数据状态(空/显式/稀疏/完整)以适应不同规模数据,采用14位精度提供约1%误差率。实现亮点包括:内存优化策略(小数据显式存储、中等稀疏存储、大数据完整存储)、基于MurmurHash64的哈希处理、分桶统计与前导零计算、调和平均数估算基数,以及序列化优化(自适应选择稀疏/完整格式)。通过状态转换机制和智能存储策略,在保证精度的同时显著降低内存占用,适合大规模数据统计原创 2025-10-10 17:01:23 · 955 阅读 · 0 评论 -
Netty DefaultPriorityQueue:如何 log n 时间 删除任意元素 和 调整任意元素的优先级
Netty的DefaultPriorityQueue是一个高性能优先队列实现,通过创新的索引维护机制优化了元素操作效率。关键设计在于要求队列元素实现PriorityQueueNode接口,使元素自行记录在队列数组中的位置索引。这一设计将删除和优先级更新操作的时间复杂度从O(n)降低到O(logn)。队列内部采用二叉堆结构,通过bubbleUp和bubbleDown算法维护堆序性质。相比JDK标准优先队列,它特别适合需要频繁执行元素删除和优先级变更的场景,如Netty的任务调度系统。原创 2025-08-06 10:27:49 · 689 阅读 · 0 评论 -
hadoop.yarn 带时间的LRU 延迟删除
org.apache.hadoop.yarn.util.LRUCache是Hadoop YARN中基于最近最少使用(LRU)策略的缓存实现。它利用LinkedHashMap实现基础存储结构,通过accessOrder参数控制元素访问顺序,自动移除最久未使用的条目。该缓存支持容量限制和过期时间双重控制,使用CacheNode包装类记录时间戳实现过期检查。通过synchronized关键字保证线程安全,并采用延迟删除策略,在get操作时检查过期状态。这种设计既实现了经典的LRU算法,又扩展了过期功能原创 2025-08-01 16:07:23 · 572 阅读 · 0 评论 -
Paimon Lookup 哈希文件和Sort文件选择
Paimon的Lookup结构分为HashLookupStore和SortLookupStore两种实现。HashLookupStore通过哈希映射实现理论O(1)查找性能,但存在哈希冲突风险,构建复杂且资源占用高;SortLookupStore采用二分查找实现稳定O(logn)性能,构建效率高,资源利用率好。Paimon默认选择Sort实现,因其通用性强、性能稳定。Hash实现仅适用于对查找延迟有极致要求且能接受更高资源消耗的特定场景。两种实现各有优劣,需根据具体业务需求选择。原创 2025-07-12 15:53:38 · 836 阅读 · 0 评论 -
Paimon哈希lookup文件构建解析
HashLookupStoreWriter是Paimon中用于创建本地哈希查找文件的实现类,采用两阶段写入策略构建基于哈希的持久化存储结构。首先按Key长度分组收集数据到临时文件,然后在close阶段构建哈希索引并合并为最终文件。该类使用开放地址法解决哈希冲突,支持布隆过滤器和数据压缩。 配套的HashLookupStoreReader通过元数据驱动的随机访问实现高效查找,利用FileBasedRandomInputView提供直接定位能力,配合布隆过滤器快速排除不存在的Key。因为是随机访问,使用页缓存。原创 2025-07-12 15:07:28 · 1174 阅读 · 0 评论 -
Paimon 高效哈希:MurmurHashUtils解析
MurmurHashUtils是Paimon项目中的高效哈希工具类,实现了MurmurHash3算法(32位版本)。该类采用final修饰且构造器私有,作为纯工具类使用。核心特性包括:使用Unsafe API直接操作内存提升性能;提供多种哈希方法支持字节数组、MemorySegment等不同输入;通过分块处理、尾部处理、最终混合三个阶段确保哈希质量。算法利用魔法常数C1/C2进行位混合,默认种子42,并确保结果为正数。特别适合哈希表、布隆过滤器等需要快速优质哈希的场景,是Paimon数据结构和算法的重要基础原创 2025-07-05 20:49:34 · 910 阅读 · 0 评论 -
Paimon 位图索引解析:高效等值查询的秘密( Bit-Sliced Index)
BitmapFileIndex采用RoaringBitmap32数据结构,适用于低基数列的等值查询,通过行号位图精准定位数据,并优化了单值存储空间。BitSliceIndexBitmapFileIndex采用位切片技术,专为数值型范围查询设计,通过分离正负数处理实现高效过滤。两种索引均采用延迟加载策略,并与数据文件强绑定。BitmapFileIndex的序列化过程更为复杂,通过特殊编码优化单值存储,而BitSliceIndex的序列化则相对直接。原创 2025-07-05 16:53:00 · 1119 阅读 · 0 评论 -
Paimon 布隆过滤器索引
本文系统分析了布隆过滤器的核心原理及其在Paimon中的实现。首先推导了布隆过滤器的最优参数公式,包括位图大小m和哈希函数个数k的计算方法,并解释了当位图中0和1数量均衡时效率最高的信息论原理。然后详细解析了Paimon中的BloomFilterFileIndex类结构,说明其作为索引框架入口如何通过Writer和Reader实现布隆过滤器的构建与查询。最后深入剖析了底层BloomFilter64的实现,重点阐述其基于64位哈希的高效算法、Kirsch-Mitzenmacher优化技术以及轻量级Bitset原创 2025-07-04 22:07:15 · 1033 阅读 · 0 评论 -
Netty内存池核心:PoolChunk深度解析
Netty内存池核心机制解析 PoolChunk是Netty内存池的核心组件,管理16MB连续内存块,采用分层管理策略: 分配机制: 小内存分配(<8KB)使用PoolSubpage进行细粒度管理,通过bitmap索引实现高效分配 标准内存分配以run(连续page)为单位,采用最佳适配算法 支持内存块分裂(splitLargeRun)和合并(collapseRuns)减少碎片 关键结构: runsAvailMap:维护空闲run的边界信息,支持快速合并 runsAvail:按大小分类的优先队列原创 2025-06-22 22:12:31 · 1377 阅读 · 0 评论 -
揭秘Netty高性能线程本地存储机制:FastThreadLocal
Netty的InternalThreadLocalMap和FastThreadLocal机制通过优化线程本地存储来提高性能。InternalThreadLocalMap使用数组存储代替哈希表,每个FastThreadLocal实例获得唯一索引进行直接访问,避免了哈希冲突。FastThreadLocalThread线程类型内置InternalThreadLocalMap,进一步加速访问。这套机制通过预定义缓存、兼容普通线程和确定性资源清理,在高并发场景下相比标准ThreadLocal有显著性能优势,成为Net原创 2025-06-21 10:02:22 · 738 阅读 · 0 评论 -
Java素数筛法:BitSieve类的精妙设计
BitSieve是Java.math包中用于高效筛选大素数候选者的内部工具类。它通过优化埃拉托斯特尼筛法实现素数查找,空间优化:仅存储奇数状态,节省一半空间;使用long数组位存储,进一步提高空间利用率。 两级筛选策略: 预计算小型静态筛(smallSieve)存储小素数 利用小素数快速筛选任意大数范围的候选者 高效位操作: 精心设计的索引转换公式 位掩码快速定位技术 严格验证机制: 初步筛选后仍需通过概率性素性测试 确保返回真正的大素数原创 2025-06-20 22:11:27 · 804 阅读 · 0 评论 -
Java BitSet类解析:高效位向量实现
Java的BitSet类实现了一个动态增长的位向量,通过long数组高效存储位数据。核心设计包括:1. 每个long存储64位,使用位移运算快速定位;2. 自动扩容机制确保存储空间;3. 提供set/flip/clear等原子位操作方法,以及and/or等集合运算;4. 支持与字节数组/缓冲区的相互转换。该类采用小端字节序,通过wordsInUse字段优化存储空间,但不保证线程安全。典型应用场景包括高效处理大量布尔值、位标志集合等。原创 2025-06-18 16:16:03 · 1076 阅读 · 0 评论 -
揭秘Java IdentityHashMap的关键机制
IdentityHashMap是Java中基于引用相等性的特殊Map实现,使用System.identityHashCode()和线性探测解决冲突。核心特点包括:使用Object数组交替存储键值,通过NULL_KEY特殊对象处理null键,当负载因子达2/3时自动扩容2倍。与HashMap不同,它通过"=="而非equals()比较键值,适用于需要区分对象实例的场景(如对象图转换、代理维护)。其删除操作需调用closeDeletion维护探测链,迭代器支持快速失败机制。原创 2025-06-17 16:03:02 · 714 阅读 · 0 评论 -
HashMap 核心实现原理分析
本文分析了HashMap核心实现:数据结构:采用数组+链表/红黑树结构,初始容量16(2^4),负载因子0.75关键优化:延迟初始化:首次使用时才创建数组哈希优化:高位异或增强散列性扩容机制:容量翻倍时仅需位运算判断位置变化树化阈值:链表长度≥8转为红黑树,≤6时转回链表性能特点:平均时间复杂度O(1)扩容时维护元素相原创 2025-06-11 15:26:15 · 637 阅读 · 0 评论 -
LRU 结构 LinkedHashMap:HashMap+双向链表的完美结合
LinkedHashMap是HashMap与双向链表的结合体,通过继承HashMap.Node并添加before/after指针,既保持了哈希表的高效查询,又维护了元素顺序。其核心特性包括:1)支持插入顺序和LRU访问顺序两种模式;2)通过钩子机制实现功能扩展;3)天然支持LRU缓存淘汰策略;4)Java 21新增动态定位模式。设计亮点在于高效的双向链表操作(O(1)时间复杂度)、迭代器优化(O(n)遍历)以及巧妙的内存布局(节点同时参与哈希表和链表结构),使其成为实现有序映射和缓存机制的理想选择。原创 2025-06-11 10:05:39 · 473 阅读 · 0 评论 -
深入浅出 红黑树:如何手写红黑树(基于TreeMap,算法导论的实现)
本文深入浅出了红黑树,包括双红和双黑的处理,讨论如何手写红黑树。红黑树是一种高效的自平衡二叉搜索树,通过颜色标记和旋转操作维持平衡。TreeMap基于红黑树实现,其核心是Entry节点类,包含键值、指针和颜色属性。插入和删除操作通过fixAfterInsertion和fixAfterDeletion方法维护红黑树性质。插入时处理"红红冲突",删除时处理"黑高不平衡",涉及四种情况的旋转和变色策略。这些操作确保红黑树始终保持对数时间复杂度(O(log n))的查询、插入和删除性能。原创 2025-06-09 16:32:04 · 2718 阅读 · 0 评论 -
CopyOnWriteArrayList和CopyOnWriteArraySet :并发安全的写时复制机制
CopyOnWriteArrayList采用"写时复制"机制实现线程安全,适合读多写少场景。其核心特点包括:1)读操作无锁直接访问volatile数组;2)写操作加锁并复制新数组,保证线程安全;3)迭代器使用快照机制避免并发修改异常;4)优化了批量操作和条件添加(addIfAbsent)等场景。CopyOnWriteArraySet基于CopyOnWriteArrayList实现,通过调用列表的线程安全方法提供Set功能。原创 2025-06-09 09:54:35 · 1198 阅读 · 0 评论 -
深入浅出 Arrays.sort(DualPivotQuicksort):如何结合快排、归并、堆排序和插入排序
Arrays.sort()底层采用DualPivotQuicksort,结合插入排序、堆排序和归并排序,实现高效自适应排序:✅ 智能策略 小数组(<44)用插入排序,中等数组(<65)用混合插入排序(哨兵优化) 递归深度超384转堆排序,避免退化 检测天然有序序列,自动切换归并排序✅ 双轴快排优化 5点黄金比例采样,动态选择单/双轴分区 并行分治(Fork/Join)原创 2025-06-08 16:11:26 · 1011 阅读 · 0 评论 -
DelayQueue、ScheduledThreadPoolExecutor 和 PriorityBlockingQueue :怎么利用堆实现定时任务
Java中的DelayQueue和ScheduledThreadPoolExecutor通过Leader-Follower模式优化线程唤醒机制,减少"惊群效应"。DelayedWorkQueue支持O(1)取消任务,同样使用Leader-Follower模式。PriorityBlockingQueue采用双锁机制扩容,释放主锁时允许消费,通过智能堆调整算法维护堆性质。这些设计显著提升了并发性能。原创 2025-06-07 14:56:26 · 713 阅读 · 0 评论 -
揭秘ThreadLocal:黄金分割哈希+弱引用的线程隔离
ThreadLocal通过线程专属的ThreadLocalMap实现线程安全的数据隔离。每个线程持有独立的映射表,以ThreadLocal为key存储数据副本,避免共享状态和竞态条件。其设计亮点包括:黄金分割哈希算法减少冲突、WeakReference自动内存管理、开放地址法处理哈希碰撞。支持普通/可继承/终止处理三类存储类型,并优化虚拟线程访问。该架构实现了无锁O(1)访问、自动内存回收和均匀负载,在保证线程安全的同时兼具高性能。原创 2025-06-07 13:54:25 · 656 阅读 · 0 评论 -
揭秘 CompletableFuture 的设计精髓(深入实现分析)
通过Completion构建有向无环图(DAG)实现任务流水线。关键设计包括:无锁栈管理:通过Treiber栈(CAS操作)维护依赖关系。结果传递与异常处理:结果存储于volatile字段,异常通过AltResult封装异步协作:双源操作通过CoCompletion双向监听;Signaller实现阻塞等待组合操作:anyOf和allOf分别通过AnyOf监听器和二叉树(BiRelay)协调超时机制:结合Timeout和Canceller实现任务取消与超时处理原创 2025-06-02 13:11:31 · 2073 阅读 · 0 评论 -
深入解析Java线程池:ThreadPoolExecutor设计精髓
线程池设计通过循环复用线程和阻塞队列解决核心矛盾。其核心机制是将线程run()方法封装在循环中,由线程池策略控制生命周期,实现线程复用。当无任务时,线程通过阻塞队列(生产者-消费者模型)进入等待状态避免CPU空耗。JUC线程池在此基础上扩展出精细配置:通过core/max线程数平衡资源与响应;提供多种队列和拒绝策略应对任务特性;支持线程工厂定制和生命周期管理。原创 2025-05-29 15:34:05 · 1903 阅读 · 0 评论
分享