Trie Tree和Radix Tree

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

前言


在实际应用场景中,很多时候我们会用到字典集的查找。通过一个键值key,去拿到它对应的值对象。这种方法确实很高效,很快,但是这里有个问题,当字典集储存的键值很多的情况时,毫无疑问,这里会消耗掉大量的内存空间。这个在我们做基数计数的统计应用时,这个空间会膨胀地特别厉害。本节笔者将要谈论的是对于基数统计来说,使用上更为适用的1种数据结构Trie Tree以及它的衍生优化版Radix Tree。

Trie Tree


我们先来看第一种树结构Trie Tree,名叫字典树。Trie Tree的原理是将每个key拆分成每个单位长度字符,然后对应到每个分支上,分支所在的节点对应为从根节点到当前节点的拼接出的key的值。它的结构图如下所示。

在这里插入图片描述

上图中每个节点存储的值为一个数值,当然这不是绝对的,我们可以假想这可以是key值所对应的任何值对象。只是计数统计在平时使用中更为常见一些。那么问题来了,相比较于字典集的存储方式,Trie Tree将key以树型结构构造,有什么用意呢?一个最大的帮助是公共的前缀被共享了,这样可以避免被重复地存储了。而在普通的字典集结构中,这种重复key前缀都是独立被包含在每个key内的。假设当字典集中所存储的key都带有大量重复的前缀时,Trie Tree将会消耗比普通字典结构更少的空间。

如上述所描述的,通过共享公共前缀的方式空间省了不少,但是它的查询效率如何呢?按照树的查询方式,一个查询key长度m,首先我们会将key拆分成m个字符,然后对应每个长度,从根节点依次向下,总共会进行到m次查找。因此我们可以得出,它的查询时间复杂度为O(m),随着查询key长度的增加,它所消耗的时间将会线性增长。

往深层面来看查询时间的问题,其实本质上这是树的深度引起的问题,对于长key而言,它的key对应的节点构造的深度过深。那么如果说我们将这“棵”树构造得更紧凑一些,会如何呢?于是我们有了另外一个衍生版本树:Radix Tree(基数树)。

Radix Tree


Radix Tree名为基数树,它的计数统计原理和Trie Tree极为相似,一个最大的区别点在于它不是按照每个字符长度做节点拆分,而是可以以1个或多个字符叠加作为一个分支。这就避免了长字符key会分出深度很深的节点。Radix Tree的结构构造如下图所示:

在这里插入图片描述
从上图我们可以看到,上面每个分支可以是局部部分字符串。以简单的字符查找为例,Radix Tree的搜索查找过程如下:

在这里插入图片描述

针对Radix Tree的构造规则,它的节点插入和删除行为相比较于Trie Tree来说,略有不同。

  • 对于节点插入而言,当有新的key进来,需要拆分原有公共前缀分支。
  • 对于节点删除而言,当删除一个现有key后,发现其父节点只有另外一个子节点key,则此子节点可以和父节点合并为一个新的节点,以此减少树的比较深度。

Radix Tree的insert过程如下图所示:
在这里插入图片描述

Trie Tree、Radix Tree的局限性


的确Trie Tree、Radix Tree在某些应用场景可以帮助我们节省内存使用空间,但是它们也有其使用的局限性。比如这类树结构无法适用于所有的数据类型,目前来看主要适用于能够用string字符等可作为表达式查询key的场景。

引用


[1].https://en.wikipedia.org/wiki/Radix_tree
[2].https://en.wikipedia.org/wiki/Trie

Radix Tree用法 对于长整型数据的映射,如何解决Hash冲突Hash表大小的设计是一个很头疼的问题。radix就是针对这种稀疏的长整型数据查找,能快速且节省空间地完成映射。借助于Radix,我们可以 实现对于长整型数据类型的路由。利用radix可以根据一个长整型(比如一个长ID)快速查找到其对应的对象指针。这比用hash映射来的简单,也更节省空间,使用hash映射hash函数难以设计,不恰当的hash函数可能增大冲突,或浪费空间。 阅读详情

相关推荐

数据结构之RadixTrie

RadixTrie

小阳同学的博客 2825

图解基数(RadixTree)

基数RadixTree),是一种比较有趣的数据结构,最近需要一种比较高效的查找,两度遇到了基数,便整理下来给有相关需求的伙伴提供一种思路。

qq_41583040的博客 2115

深入浅出地讲解基数Radix Tree

基数是一种在特定场景下极其高效的数据结构。它通过路径压缩的思想,以增加实现的复杂度为代价,换取了显著的空间优化。当你处理大量具有共同前缀的字符串数据,并且对内存占用非常敏感时(如网络路由、内核级数据结构),基数是一个非常值得考虑的强大工具。

u011091936的博客 1464

Linux Radix tree简介

Linux Radix tree简介以及对应的API简介

小立仔 3066

Qwen3-Max Radix TreePatricia Trie的优缺点是什么?

Patricia Trie Radix Tree 的特例,每次分裂恰好在一个位(bit)或字符上,确保每个内部节点至少有两个子节点 - 更严格的压缩- 常用于二进制键(如 IP 地址)边的粒度 任意长度字符串(如 “apple”) 固定粒度:- 字符级(Classic Patricia)- 位级(Binary Patricia,最常见)Radix Tree 一种压缩的 Trie,按字符或位串分段,合并单子节点路径 - 边可为任意长度字符串- 支持任意字母表。// 存储完整 IP。

m0_37843156的博客 188

Trie & Radix Tree

字典树与基数

Deep_C的博客 516

【redis】前缀 trie-radix tree-rax

前缀trie),基数radix tree),redis 自适应基数(rax tree),都是 前缀压缩(prefix tree)的变种 ,在存储效率、查询性能、功能逐步优化。

呆呆的猫的博客 1183

路由查找之Radix Tree

什么是Radix Tree   在计算机科学中,基数,或称Patricia trie/tree,或crit bit tree,压缩前缀,是一种更节省空间的Trie(前缀)。对于基数的每个节点,如果该节点是唯一的子的话,就父节点合并。   golang的web框架echogin都使用了radix tree作为路由查找的算法,我们以gin的实现来分析一下。   在gin的路由中,每一个...

weixin_33713707的博客 1731

Radix Tree在Hyper中的实现:解读Hyper论文《 The Adaptive Radix Tree: ARTful Indexing for Main-Memory Databases 》

本文讨论如何在实际的数据库系统中应用Radix Tree作为索引,暨解读HyPer的论文:The Adaptive Radix Tree:ARTful Indexing for Main-Memory Databases。本人其作者Viktor有过一段时间的共事,希望对大家能有帮助。 Radix Tree实际上就是前缀,也称之为Trie。相比B-Tree,其最大的特性是1)数的高度不

Michael的专栏 4544

Linux内核关键数据结构,Linux内核数据结构:Radix

描述正如你所知道的, Linux 内核通过许多不同库以及函数提供各种数据结构以及算法。这个部分我们将介绍其中一个数据结构Radix tree。Linux 内核中有两个文件与 radix tree 的实现 API 相关:include/linux/radix-tree.hlib/radix-tree.c首先说明一下什么是 radix treeRadix tree 是一个 压缩 trie, tr...

weixin_39675038的博客 304

java里面有radix吗_Trie / Radix Tree / Suffix Tree

Trie (字典树)"A", "to", "tea", "ted", "ten", "i", "in", "inn" 这些单词组成的字典树.Radix Tree (基数)基数字典树的区别在于基数将单词压缩了, 节点变得更少Suffix Tree (后缀)单词 "BANANA" 的后缀. 每个后缀以$ 结尾. 所有的后缀为A$,NA$,ANA$,NANA$,ANANA$and...

weixin_30827827的博客 323

探索高效数据结构:Adaptive Radix Tree 开源项目推荐

探索高效数据结构:Adaptive Radix Tree 开源项目推荐 在当今数据驱动的世界中,高效的数据结构对于提升系统性能至关重要。今天,我们将深入探讨一个令人兴奋的开源项目——Adaptive Radix Tree(ART),这是一个基于trie的数据结构,旨在通过垂直水平压缩实现高性能空间效率。 项目介绍 Adaptive Radix Tree项目的目标是研究实现由Leis等人提出的...

gitblog_00212的博客 1112

java patriciatrie_Patricia前缀(Patricia Trie)及其基本操作 | 学步园

Patricia前缀(Patricia Trie)及其基本操作Trie是一种字典树,用于存储文本字符,并利用了单词之间共享前缀的特点,所以叫做前缀。不像平衡BST,Trie的高度只与最长的文本串的长度s有关系,而与单词的数量n无关。Trie的节点分两种:内部结点叶子结点,内部结点用来存储单词key的成分字母,如果设字母表大小为d,那么每个内部结点最多有d个孩子,叶子结点存储该单词作为key的...

weixin_39980596的博客 763

Qwen3-Max 压缩Trie如何影响内存占用?

压缩 Trie(如 Radix Tree、Patricia Trie)对内存占用的影响是显著且积极的,通常能减少 50%~90% 的内存使用,尤其在处理长单词、高冗余前缀的词典时效果惊人。因此,在内存敏感或大规模词典场景(如嵌入式设备、搜索引擎、路由系统),压缩 Trie 是首选结构。配合零拷贝字符串存储,可达到极致压缩。节点:root + “appl” + “e” + “t” + “ication” = 5 个节点。示例:插入单词 “apple”, “applet”, “application”

m0_37843156的博客 134

压缩前缀 / 后缀结构在 Trie / Radix Tree 中的优化

介绍TrieRadix Tree的基本概念,分析传统结构的存储查询效率问题,引出压缩前缀/后缀的必要性,包括减少节点数量、降低内存占用提升查询性能。详细说明如何通过合并公共前缀来减少的高度节点数量,具体实现可能包括单字符压缩、多字符压缩以及动态调整策略,比较不同方法的优缺点。探讨后缀压缩的技术,例如合并唯一路径上的节点,分析其对插入、删除查询操作的影响,结合实际案例说明性能提升效果。研究动态调整压缩程度的方法,根据数据分布访问模式自适应选择压缩前缀或后缀,提出基于统计或机器学习的技术方案。

kasebon的博客 168

Linux内核数据结构:基数Radix Tree

基数是一种将指针与长整数键值相关联的机制,存储有效率且可快速查询,常用于指针与整数值的映射、内存管理等。它是一种多叉搜索,叶子结点是实际的数据条目,每个结点有固定数量的指针指向子结点,并有一个指针指向父结点。基数,也被称为 PAT 位(Patricia Trie or crit bit tree),是通用的字典类型数据结构。Linux 内核使用了数据类型 unsigned long 的固定长度输入的版本,每级代表了输入空间固定位数。在 Linux 内核中,基数有广泛的用途,比如用于内存管理。

深度Linux 1442

Qwen3-Max 压缩Trie如何影响查询性能?

压缩 Trie(如 Radix Tree、Patricia Trie)在减少内存占用的同时,对查询性能的影响是 双刃剑:在多数场景下提升性能,但在某些情况下可能轻微下降。短单词(≤5 字符) 极快(O(1) 跳转) 略慢(需字符串比较) 原始 Trie。压缩 Trie:4 层(“/usr”, “/local”, “/bin”, “/java”)高扇出节点 O(1) 访问 O(k) 遍历边 原始 Trie(除非优化)”,但节点只有 “apple”, “apply” 边。

m0_37843156的博客 324

网页分析/挖掘中常用数据结构算法

网页在render的时候都生成DOM的,所以形的数据结构用的会比较多,常见的结构: [url="http://en.wikipedia.org/wiki/Trie"]Trie[/url], [url="http://en.wikipedia.org/wiki/Radix_tree"]Patricia tree/Radix tree[/url]一种trie的压缩形式,它把只有一个孩子的结点与...

fuliang 652

基数Radix Tree)实战指南:从原理到Python实现

本文深入解析基数Radix Tree)的核心原理与Python实现,对比其与Trie在内存占用查询效率上的优势。通过实战案例展示基数在URL路由、自动补全等场景的高效应用,并提供完整的Python代码实现及性能优化技巧,帮助开发者掌握这一高效数据结构。

weixin_28358083的博客 236
上一篇: DataNode Layout升级解决Du操作引发的性能问题
下一篇: HDFS RBF的资源隔离设计
Android路上的人
Android路上的人 领域专家: 大数据技术领域 领域专家: 大数据技术领域
博客等级 码龄14年 3398粉丝 451原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值