基数树RadixTree

转自:基数树RadixTree - 知乎

1. 基数树概述

  • 对于长整型数据的映射,如何解决Hash冲突和Hash表大小的设计是一个很头疼的问题。
  • radix树就是针对这种稀疏的长整型数据查找,能快速且节省空间地完成映射。借助于Radix树,我们可以实现对于长整型数据类型的路由。
  • 利用radix树可以根据一个长整型(比如一个长ID)快速查找到其对应的对象指针。这比用hash映射来的简单,也更节省空间,使用hash映射hash函数难以设计,不恰当的hash函数可能增大冲突,或浪费空间。
  • radix tree是一种多叉搜索树,树的叶子结点是实际的数据条目。每个结点有一个固定的指针指向子结点(每个指针称为槽slot,n为划分的基的大小)

2. 插入、删除操作

  • radix Tree(基数树) 其实就差不多是传统的二叉树,只是在寻找方式上,利用比如一个unsigned int的类型的每一个比特位作为树节点的判断。
  • 比如一个数1000101010101010010101010010101010,那么按照Radix 树的插入就是在根节点,如果遇到0,就指向左节点,如果遇到1就指向右节点,在插入过程中构造树节点,在删除过程中删除树节点。如果觉得太多的调用Malloc的话,可以采用池化技术,预先分配多个节点。
  • 使用一个比特位判断,会使树的高度过高,非叶节点过多。故在实际应用中,我们一般是使用多个比特位作为树节点的判断,但多比特位会使节点的子节点槽变多,增大节点的体积,一般选用2个或4个比特位作为树节点即可。
  • 如图:

  • 插入操作:我们在插入一个新节点时,我们根据数据的比特位,在树中向下查找,若没有相应结点,则生成相应结点,直到数据的比特位访问完,则建立叶节点映射相应的对象。
  • 删除操作:我们可以“惰性删除”,即沿着路径查找到叶节点后,直接删除叶节点,中间的非叶节点不删除。

3. RadixTree应用

  1. Radix树在Linux中的应用
  2. Linux基数树(radix tree)是将long整数键值与指针相关联的机制,它存储有效率,并且可快速查询,用于整数值与指针的映射(如:IDR机制)、内存管理等。
  3. IDR(ID Radix)机制是将对象的身份鉴别号整数值ID与对象指针建立关联表,完成从ID与指针之间的相互转换。IDR机制使用radix树状结构作为由id进行索引获取指针的稀疏数组,通过使用位图可以快速分配新的ID,IDR机制避免了使用固定尺寸的数组存放指针。IDR机制的API函数在lib/idr.c中实现。
  4. Linux radix树最广泛的用途是用于内存管理,结构address_space通过radix树跟踪绑定到地址映射上的核心页,该radix树允许内存管理代码快速查找标识为dirty或writeback的页。其使用的是数据类型unsigned long的固定长度输入的版本。每级代表了输入空间固定位数。Linux radix树的API函数在lib/radix-tree.c中实现。(把页指针和描述页状态的结构映射起来,使能快速查询一个页的信息。)
  5. Linux内核利用radix树在文件内偏移快速定位文件缓存页。
    Linux(2.6.7) 内核中的分叉为 64(),树高为 6(64位系统)或者 11(32位系统),用来快速定位 32 位或者 64 位偏移,radix tree 中的每一个叶子节点指向文件内相应偏移所对应的Cache项。
  6. 【radix树为稀疏树提供了有效的存储,代替固定尺寸数组提供了键值到指针的快速查找。】
  7. RadixTree数据库和Spark RDD中应用
    2013年在ICDE上有一篇《The Adaptive Radix Tree: ARTful Indexing for Main-Memory Databases》论文,专门论述ART是如何用在内存数据库方面的。
  8. 2014年Spark项目组启动indexedRDD设计理念,其中用到的主要存储结构就是ART。

4. 总结

  • Radix树与Trie树的思想有点类似,甚至可以把Trie树看为一个基为26的Radix树。(也可以把Radix树看做是Tire树的变异)
  • Trie树一般用于字符串到对象的映射,Radix树一般用于长整数到对象的映射。
  • trie树主要问题是树的层高,如果要索引的字的拼音很长很变态,我们也要建一个很高很变态的树么?
  • radix树能固定层高(对于较长的字符串,可以用数学公式计算出其特征值,再用radix树存储这些特征值)
  • 相关代码可以参考这里

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用chatgpt实现 java导出excel复杂表。

记录一次使用chatgpt解决实际问题的,需求是在页面添加一个订单导出excel的功能,订单编号、订单明细,相同订单编号合并单元格,模板如下 表头表尾不用说, 主要是表格内容部分,左边是订单编号,右边…

ChatGPT常见问题及其解决方法汇总

好久没有更新过技术类的文章了,希望本篇文章能够对你有所帮助,今天这篇博客将会把ChatGPT注册中可能遇到的问题彻头彻尾的讲一下,创作不易,如果感觉有帮助的话就动动你发财的小手点个收藏点个赞吧。如有需要转载请附上原文链接&am…

微软骚操作恶心Win10用户,上网得先看广告

IE 浏览器在几个月前被彻底禁用,预装了快30年的老古董也确实到了退役的时候。 而微软也早有准备,2015年随着 Win10 发布推出了 Microsoft Edge 浏览器。 2020年迁移到 Chromium 内核让其成为了主流浏览器之一。 和 Chromium 系其他浏览器一样支持扩展插…

Portraiture4最新版滤镜P图一键磨皮插件

今天coco玛奇朵给大家带来了一款ps磨皮插件,超级简单好用。Portraiture 滤镜是一款 Photoshop,Lightroom 和 Aperture 插件,DobeLighttroom 的 Portraiture 消除了选择性掩蔽和逐像素处理的繁琐的手工劳动,以帮助您在肖像修整方面…

TiDB实战篇-PD调度常见问题处理方法

常见的问题 调度产生和执行 常见的调度类型 参数调度的速度 调度典型场景 Leader分布不均匀监控 leader分布算法,每一个leader的size作为总和,还有TiKV的剩余空间等等。 可以手动设置权重。 分布不均衡处理 TiKV节点下线速度慢 TiKV下线速度慢解决方法 …

IntelliJ IDEA修改背景颜色大全(护眼绿等)设置注释颜色

一.IDEA默认有3种背景颜色 路径为File->settings->Editor->Color Scheme可以设置软件默认颜色,旁边的小齿轮添加颜色名字 二.IDEA扩展颜色(护眼绿) 第一种方法: IDEA设置一张背景图片,路径:File->Setti…

Mysql 中left join时 on、and、where区别

1、准备两张表student与class表 student class 2、left join on左连接 select * from student s left join class c on s.classId c.id 左表数据全部显示,关联到的右表数据显示,没有显示null 3、left join on ... and对左表student进行条件筛选 …

深入理解Java Class文件格式 constant_UTF_info

首先, 让我们回顾一下关于class文件格式的之前两篇博客的主要内容。 在 深入理解Java Class文件格式(一) 中, 讲解了class文件在整个java体系结构中的位置和作用, 讲解了class文件中的魔数和版本号相关的信息&#xff…

Postman+Java springboot演示 get post put delete请求并携带(路径 路径问号后 json 表单)参数形式

我们先创建一个java的springboot工程 在项目中 找到启动类的位置目录 在项目创建一个类 叫 user 我是想将 user 当做一个属性类的 按规范来讲 我们可以创建一个entity包 然后在下面去创建属性类 但这里 我们不想搞那么麻烦了 毕竟只是练习一下 然后 user参考代码如下 package…

Django框架004:orm对mysql的增删改查

大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页: lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

力扣---LeetCode141/142. 环形链表 (I)和(II) (代码详解+流程图+数学逻辑拓展)

文章目录 前言141. 环形链表 I1.1 链接:1.2 思路:1.3 代码:快慢指针1.4 流程图: 142. 环形链表 II2.1 链接:2.2 思路:2.3 代码:2.4 流程图: 拓展问题及证明(面试常问):3.…

线上问题-CPU使用频率飙升

描述 中午收到群内人员反馈环境访问速度慢。登录验证码打不开等问题。通过查看日志发现是kafka出现问题,无法处理消息。联系运维解决。在排查的过程中使用mobaXterm连接服务器。左下角看到CPU使用频率非常高。于是记录一下通过CPU查看程序占用情况分析问题。 过程 …

Ansys Lumerical | CMOS - 光学仿真方法

通过使用更小的像素尺寸和更大的填充因子,基于CMOS图像传感器像素的数码相机系统的成本正在降低。但是,只有在不牺牲图像质量的情况下,CMOS像素尺寸减小才是可以接受的。随着CMOS像素尺寸的不断减小,图像信噪比降低,相…

2.1 Linux命令行

系列文章目录 第1章 Linux Shell简介 第2章 Shell基础 <本章所在位置> 第3章 Bash Shell基础命令 第4章 Bash Shell命令进阶 第5章 Linux Shell深度理解 第6章 Linux环境变量 第7章 Linux文件权限 第8章 Linux文件系统的管理 第9章 Linux软件安装 第10章 Linux文本编辑器…

记录一次docker容器引起的时间相差8h的问题

一、背景 系统打印日志时间小8h&#xff0c;部分插入mysql的日期却大8h&#xff0c;简直诡异。 测试时间是上午10:05 经过排查&#xff0c;mysql设置的时区&#xff0c;链接url设置的时区都是ok的。而且有其他服务时间正常&#xff0c;故排除MySQL的问题。 二、排查 2.1 查…

聚焦丨酷雷曼荣列XRMA联盟成员单位

自“元宇宙”概念兴起之初&#xff0c;酷雷曼VR所属北京同创蓝天云科技有限公司就积极布局、探索和实践。2022年12月&#xff0c;酷雷曼VR成功加入虚拟现实与元宇宙产业联盟&#xff08;XRMA&#xff09;&#xff0c;正式被接纳为联盟成员单位&#xff0c;意味着酷雷曼公司将进…

【电动车】基于双层凸优化的燃料电池混合动力汽车研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清…

rosbag相关进阶操作

一些很好用的网站 时间戳在线转换网页 旋转矩阵、四元数、绕轴旋转、欧拉角在线转换网页 四元数、欧拉角可视化在线转换网页 一、按时间截取bag 使用如下代码&#xff1a; rosbag filter 原始包名.bag 截取后的包名.bag "t.to_sec() > 开始时间 and t.to_sec() <…

初识Elasticsearch

初识Elasticsearch Elasticsearch 是一个分布式&#xff0c;RESTful 风格的搜索和数据分析引擎。它能够提供实时的搜索与数据分析功能&#xff0c;且能够将几乎所有类型的数据存储和搜索&#xff0c;包括结构化和非结构化数据。 在该博文中&#xff0c;我们将介绍 Elasticsea…

在CentOS上安装Jenkins并配置Docker

文章目录 步骤1 - 安装Java 11步骤2 - 安装Jenkins步骤3 - 安装Docker步骤4 - 配置Docker Cloud步骤 5 - 验证步骤 6 - 可能会遇到的问题 在本教程中&#xff0c;我们将展示如何在CentOS上安装Jenkins和Docker&#xff0c;并将它们配置在同一台机器上&#xff0c;使Jenkins能够…
最新文章