原始Radix Tree与路径压缩

Radix Tree简介

Radix tree 是一种前缀字典树,它的主要特点是树的高度不随数据库大小和节点数量改变,而是由 key 的长度决定。B树需要根据数据量增长或压缩,保持平衡,Radix tree 不需要平衡操作,任意插入顺序的 key 最终会得到同一棵树。Key 按照字典顺序排序,因此走向叶子节点的路径表示叶子节点的 key,中间节点路径可以通过 key 重构。Radix 树的结构取决于 key 的分布,当 key 稀疏时,内存使用效率低。Radix tree 的主要问题是 key 的分布对树的结构和内存利用率影响很大,分布稀疏的树浪费空间,节点的使用率不高。

传统Redix Tree分为两种,一种是原始Radix tree,另一种使用路径压缩来节省内存。

原始Redix Tree

树节点不显式存储键,而是存储子指针数组,每个子指针由多个bits构成的搜索键(部分键)来索引,就像哈希索引一样。

如图是一棵原始Radix tree,key长度为16bits,树每层节点的部分key长度为4bits,因此每个节点有=16个元素。以key=527的查找为例,第0层查找0000(0),第1层查找0010(2),第2层查找0000(0),第3层查找1111(15)从而找到527。比起B树以及B树变体,Radix Tree的好处在于不需要进行key的比较,查找key=527仅仅需要通过数组下标[0]、[2]、[0]、[15]在每层找到对应子指针即可。

路径压缩

路径压缩分为悲观、乐观以及混合三种方式,悲观路径压缩将被折叠的搜索路径保存为子节点中的前缀数组,乐观路径压缩保存折叠路径的前缀长度而不是前缀本身,混合方式结合了悲观与乐观两种方式。这样说不是很直观,下面我们以混合方式的路径压缩为例进行解释。

在原始Radix Tree的基础上,每个节点添加一个header的结构,depth可以简单理解为节点所在的层数,PrefixLen表示共同前缀的个数,可以理解为乐观路径压缩所说的前缀长度,PrefixArr数组用来存共同前缀,可以理解为悲观路径压缩所说的前缀数组。

对于没有共同前缀的key,如key=8209与其余三个key没有共同前缀,因此直接省去其路径,A3(root)的第3(0010)个子指针直接指向key=8209的叶节点,而key=512、514、527三个键值具有共同前缀0010 0000,因此在子节点B3中,前缀长度为2,前缀数组中的两个前缀分别为0010(2)、0000(0),第0、2、15个子指针分别指向三者的叶节点。

通过对没有共同前缀的key直接省去其路径,对有共同前缀的key保存其前缀长度和共同前缀,完成了混合方式的路径压缩。

那么如果此时插入了一个key=546的元素,由于与key=512、514、527的元素相比,其第二个部分键0010相同,而第三个部分键不相同,因此需要分裂并创建一个具有更短的共同前缀的节点C4,并且删除原B3(现B4)的前缀数组,将C4的第1个子指针指向B4,第3个子指针指向key=546的叶节点(因为没有其他key与其有共同前缀了,因此直接省略其路径),最后更新原A3的子指针。从这个过程可以看到,原B3的depth=1,prefix length=2,表示B3有第2和第3个前缀,在插入key=546的元素后,B4的depth=3,prefix length=0,表示其不再有共同前缀,并且每个子指针直接指向最后的叶子节点。


参考来源:WORT论文 https://www.usenix.org/system/files/conference/fast17/fast17-lee.pdf

原始Radix Tree与路径压缩相关推荐

  1. WORT: Write Optimal Radix Tree for Persistent Memory Storage Systems

    WORT: Write Optimal Radix Tree for Persistent Memory Storage Systems FAST17的一篇文章,介绍了内存索引中使用基数树保证数据一致 ...

  2. Redis radix tree源码解析

    Redis实现了不定长压缩前缀的radix tree,用在集群模式下存储slot对应的的所有key信息.本文将详述在Redis中如何实现radix tree. 核心数据结构 raxNode是radix ...

  3. redis radix tree的简单解释

    所有例子均出自源码. Radix tree压缩前缀树,是redis在5.0新加入的用来存储key的数据结构. 前缀树的节点结构如下. typedef struct raxNode {uint32_t ...

  4. 并查集及路径压缩模板

    并查集那最简单的应用就是合并两个元素和查询两个元素是否属于同一集体,它的工作过程如下:首先将每个元素放在单独的一个集合里,集合的名字就是这个元素的编号,对于查询操作就找两个元素的所在集合编号,集合编号 ...

  5. Linux: radix tree实现简析

    文章目录 1. 前言 2. 测试环境 3. 实现 3.1 概念 3.2 数据结构 3.3 对基数树的操作 3.3.1 初始化 3.3.2 插入 3.3.3 查找 3.3.4 删除 3.3.5 tag ...

  6. 【页高速缓存】radix tree 源码解析

    项目要在内核做和页高速缓存相类似缓存机制,在写内核代码之前必须先搞清楚页高速缓存源码是什么情况. 之前有一篇博客分析过了页高速缓存的基础,但是远远没有达到动手写代码的基础.这几天端午节假期集中精力,搞 ...

  7. 22中超联赛day8 1007(hdu7226) Darnassus 并查集(按秩合并+路径压缩)+ 链式前向星桶排 + Kruskal求最小生成树

    Darnassus 题目描述 Even the World Tree must bow to the cycle of life. Everything born will die. Archimon ...

  8. 并查集路径压缩_并查集(UnionFind)技巧总结

    什么是并查集 在计算机科学中,并查集是一种树型的数据结构,用于处理一些不交集(Disjoint Sets)的合并及查询问题.有一个联合-查找算法(Union-find Algorithm)定义了两个用 ...

  9. Rochambeau POJ - 2912 (枚举和加权并查集+路径压缩)找唯一裁判

    题意:有n个人玩石头剪刀布,有且只有一个裁判.除了裁判每个人的出拳形式都是一样的. a<b表示b打败a,a=b表示a和b出拳一样,平手.a>b表示a打败b. 给出m个回合的游戏结果,问能否 ...

最新文章

  1. 镁光ssd管理工具 linux,在 SSD 上使用 Btrfs 文件系统的相关优化
  2. springboot 整合retry(重试机制)
  3. rpm 使用手册 (谷歌翻译)
  4. JavaScript内置一些方法的实现原理--new关键字,call/apply/bind方法--前戏
  5. 二进制蚁群算法【源码实现】
  6. 运维大数据可视化分析平台来了,枯燥运维数据也可以生动起来
  7. 标签 href 怎么拼接_【微信】用户-标签的兴趣建模
  8. MFC中文件打开与保存
  9. AAAI 2021 | 视频超分中的可变形对齐解读
  10. it生命周期管理-资产管理
  11. Ubuntu 学习系列-安装Flash播放器
  12. PHP开发入门 | 简单的PHP新闻管理系统案例
  13. 【MATLAB】MATLAB 2017A 软件安装
  14. 插值算法(数学建模)
  15. Can‘t connect to any repository: http://gitee.com/user.rame/java.git
  16. An invalid domain [] was specified for this cookie问题解决
  17. 去除Android状态栏的广告推送
  18. 十三、用卡诺图化简真值表例题(2)
  19. android studio 使用夜神模拟器
  20. 力扣 两数相加 C语言 题解

热门文章

  1. 中国市场iPad一代落价至最低2888元
  2. PS与PL协同设计实现GPIO
  3. insmod源码分析
  4. Unexpected token o in JSON at position 1 报错原因及解决方法
  5. JavaScript---GO---Python三大语言爬虫
  6. 分布式事务,再说说解决方案
  7. python立体图形_Python/OpenCV:从立体图像计算深度图
  8. Python编写的DHT的搜索引擎(测试)
  9. 大数据技术炙手可热 专业人才短缺成发展掣肘
  10. iOS Mobile中input隐藏输入光标