基数树简介

文章目录

  • 1.简介
  • 2.为什么要设计基数树?
  • 3.应用
  • 4.操作
    • 插入
    • 删除
    • 查找
  • 5.小结
  • 参考文献

1.简介

基数树(Radix Trie)也叫基数特里树或压缩前缀树,是一种多叉树,一种更节省空间的 Trie(前缀树)。

基数树中作为唯一子结点的每个结点都与其父结点合并,每个内部结点的子结点数最多为基数树的基数 r,r 为正整数且等于2^n(n>=1)。这使得基数树更适用于对于较小的集合(尤其是字符串很长的情况下)和有很长相同前缀的字符串集合。

不像一般的 Trie,基数树的边可以是一个或者多个元素。

在这里插入图片描述

2.为什么要设计基数树?

举个例子,一目了然。对于下面四个kv键值对,我们如何存储?

<0101,"abc">
<010,"abcd">
<001,"bcde">
<0110,"cdef">

有人说用hash表,是可以,但是hash表有两个问题:
1.hash冲突。hash函数不好设计,容易产生冲突,需要解决hash冲突
2.hash表大小不好确定。hash表底层还是数组实现的,数组的大小不好确定,涉及到扩容的问题

如果用 Radix Tree 就很容易解决上面两个问题,看下图:

在这里插入图片描述
上图就是 r=2 的基数树。是否似曾相识?没错,字典树(Trie Tree)就是 r=26 的基数树。或者说基数树是字典树的一个扩展。

当 key 的长度很大,那这棵树岂不是很高?比如 key=01110001010001010101101。为了减少树的高度,一般用多个比特位作为一个节点,但多比特位会使槽位变多,增大节点的体积,一般用 2-4 个比特作为一个节点。如图:

在这里插入图片描述
上图是 r=4 的基数树。

3.应用

Radix 树主要用于字符串的存储和检索,常见的应用包括:

  • 前缀匹配和自动补全:Radix 树可以用于实现前缀匹配和自动补全功能,比如搜索引擎中的搜索提示和自动完成。
  • 模式匹配和字符串搜索:Radix 树可以用于实现模式匹配和字符串搜索功能,比如文本编辑器中的搜索和替换功能。
  • IP 路由:Radix 树可以用于将 IP 地址映射为其对应的路由器,从而实现高效的路由和负载均衡。
  • 数据库索引和查询优化:Radix 树可以用于实现数据库索引和查询优化,比如在 NoSQL 数据库中存储 JSON 数据。
  • 文件系统的路径匹配:Radix 树可以用于实现文件系统中的路径匹配,比如 Unix 文件系统中的路径解析。

此外,著名的 Golang Web 框架 Gin 在 route 搜索上便使用了基数树。

4.操作

Radix tree支持插入、删除、搜索等方面的操作。

插入

插入操作是添加一个新的字符串到 Trie 树中并尝试最小化数据存储(即对某些节点进行合并)。

对于一颗空树的初始状态,基数树和字典树是一致的,只有 root 节点。

在这里插入图片描述
对基数树和字典树插入相同的字符串【abcd】,因为新子串无额外分叉,因此可以对子串压缩。

在这里插入图片描述
对基数树和字典树插入相同的字符串【abce】,当基数树的某一个节点需要分叉时,则对该节点进行分裂后再加入新节点。

在这里插入图片描述
对基数树和字典树插入相同的字符串【aecb】。

在这里插入图片描述

对基数树和字典树插入相同的字符串【aecd】。

在这里插入图片描述
如上图的结果,基数树在这组 case 中,比字典树的深度少 1。以牺牲建树过程中的额外引入分裂操作,来优化查找时的效率。

删除

基于上文中的树,对基数树和字典树删除相同的字符串【abcd】,可以看到因为节点(bc)的分叉消失,因此和子节点合并为(bce)。

在这里插入图片描述
对基数树和字典树删除相同的字符串【abce】,同理,节点(a)和其子节点(ec)合并为(aec)。

在这里插入图片描述
对基数树和字典树删除相同的字符串【aecb】。

在这里插入图片描述
对基数树和字典树删除相同的字符串【aecd】后,两树为空。

在这里插入图片描述

查找

因为基数树的本质依然属于字典树,因此在查找使用上和字典树并无不同。从根节点开始遍历字符串,对于每个字符,检查当前节点的子节点是否包含该字符,如果包含,则继续遍历下一个字符,否则说明该字符串不存在于 Radix 树中。

Radix 树的查找操作相对于 Trie 树的查找操作有一个优点,因为基数树通过压缩,使得在前缀有一定规律的串在树中的深度更低,因此查找效率也较高。

5.小结

Radix 树是一种高效存储和搜索字符串的数据结构,它通过一些优化策略实现了比 Trie 树更好的时间和空间复杂度。Radix 树的节点代表字符串的前缀,具有一些特殊的性质,可以应用于很多领域,比如路由和负载均衡、前缀匹配和自动补全、模式匹配和字符串搜索、数据库索引和查询优化、文件系统中的路径匹配


参考文献

OpenAI ChatGPT
Radix tree - Wikipedia
基数树(Radix Tree) - 掘金
图解基数树(RadixTree) - 梦旭随想

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

0101代理模式详解-设计模式-spring

1 概述 代理模式是一种结构型设计模式&#xff0c;它通过提供一个代理对象来控制对另一个对象的访问。在代理模式中&#xff0c;代理对象充当原始对象的接口&#xff0c;客户端可以通过代理对象来访问原始对象&#xff0c;代理对象则可以控制对原始对象的访问&#xff0c;并在…

chatgpt赋能python:Python中的按位取反

Python中的按位取反 Python中的按位取反是一种常见的操作&#xff0c;它可以让我们快速地对二进制的数字进行取反操作。在本文中&#xff0c;我们将介绍Python中的按位取反操作&#xff0c;并探讨它的用途和示例。 什么是按位取反 按位取反是一种将二进制数中的每一位进行反…

HDBits刷题2: Circuit

1.combinational logic: 组合逻辑 1.1 basic gates: 基本逻辑门 wire 解答: module top_module (input in,output out);assign out in; endmodule GND 解答: module top_module (output out);assign out 1b0; endmodule NOR 解答: module top_module (input in1,input in2,ou…

stm32f103rct6使用内部晶振作为时钟源

目录 正点原子库函数1.void SystemInit(void)2.FLASH3.宏定义4.查看5.延时6.最终结果7.精准延时尝试&#xff08;失败&#xff09; HAL库函数1 宏定义2 时钟配置3 main函数中调用4 例子代码 寄存器版本&#xff08;跑通串口&#xff09;代码示波器查看波特率 正点原子库函数 s…

Esight | 类比ChatGPT的AI助理

很多行业内的小伙伴都在使用我们的低功耗分析设备mPower1203&#xff0c;它为大家在产品功耗的分析评估和优化上提供了很大的帮助&#xff0c;也为产品的工厂自动化提供了便捷的应用。为了更好的服务于研发工程师&#xff0c;配套的上位机工具Esight集成了ChatGPT【AI助理】的功…

0101壳-手写springboot-springboot系列

文章目录 1 前言1 创建我们自己的pringboot模块1.1 引入相关依赖1.1 启动类注解1.2 启动类 2 测试模块3 启动测试结语 1 前言 springboot有以下作用&#xff1a; 简化配置&#xff1a;Spring Boot提供了一组预定义的自动配置选项&#xff0c;可以快速地配置应用程序&#xff…

网络:chrome抓包

Network面板 按F12或者CTRLSHIFTI就可以召唤出这个面板 控制器&#xff1a;控制面板的外观和功能过滤器&#xff1a;过滤请求列表中显示的资源概览&#xff1a;显示HTTP请求、响应的时间轴请求列表&#xff1a;默认按照请求的先后时间排序&#xff0c;每选择一个请求还会跳出…

用ChatGPT高效学习:7天入门Python网络爬虫

以前不懂编程&#xff0c;但经常要从互联网上批量下载一些文件图片视频、收集整理数据等&#xff0c;手工操作耗时耗力。用ChatGPT入门了Python编程后&#xff0c;就寻思着可以再利用ChatGPT入门网络爬虫。 先让ChatGPT给我列出一个学习计划&#xff1a; 我有一些Python编程基…

Oracle 发力 MySQL,MariaDB 成功上市,大规模融资锐减 | 解读数据库的 2022

又一年过去了&#xff0c;生活还在继续&#xff0c;现在是反思去年数据库世界所发生事件的绝佳时机。 链接&#xff1a;https://ottertune.com/blog/2022-databases-retrospective/ 声明&#xff1a;本文为 CSDN 翻译&#xff0c;未经允许禁止转载。 作者 | Andy Pavlo 译者 | …

【GPT-4 ChatGPT】第 2 章 :深入了解GPT-4 和 ChatGPT API

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

Python基于Oxford-IIIT Pet Dataset实现宠物识别系统

先看效果&#xff1a; Oxford-IIIT Pet Dataset是一个不错的数据集&#xff0c;牛津官方整理出来的一个关于各种猫和狗的数据集&#xff0c;可以很方便被我们用来做图像识别或者是图像分割类型的任务&#xff0c;这里我们主要是做图像识别的应用。 官方介绍如下所示&#xff1a…

Python用户管理系统,宠物管理系统

用户管理系统 surface """ #三引号是Python的注释符号&#xff0c;但也可以作为字符串输出 **************************************** 用户管理系统 **************************************** 1、注册新用户 2、用户登录 3、用户注销 4、用户信息显示 5、退…

基于涂鸦智能的宠物喂食器

基于涂鸦智能的宠物喂食器 一、开发计划二、涂鸦三明治开发套件涂鸦三明治 Wi-Fi MCU 通信板喇叭涂鸦三明治H桥直流电机驱动功能板涂鸦三明治直流供电电源板MCU主控板 三、产品开发1、产品创建进入涂鸦IoT平台创建产品选择对应的功能点和设备面板下载SDK 2、MCU SDK移植对串口寄…

宠物领养平台的分析与实现

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 文末获取源码 项目编号:BS-PT-052 运行环…

智能宠物项圈app开发解决方案

智能宠物项圈app开发解决方案&#xff0c;今天主要介绍的就是智能宠物项圈app开发方案中的功能。它的功能主要有多重定位&#xff0c;实时定位、出入范围提醒&#xff0c;踪迹随时可寻、远程呼唤、电子围栏、活动监测等&#xff0c;接下来我就来全面的介绍一下。 智能宠物项圈a…

宠物店会员管理系统| 宠物店小程序

国内养宠家庭非常多&#xff0c;推动着国内宠物市场发展&#xff0c;而围绕宠物的细分行业&#xff0c;如宠物食品、宠物用品/医疗/美容/婚介/殡葬等&#xff0c;2019年我国宠物市场规模达2024亿元&#xff0c;预计2023年&#xff0c;市场规模将突破4000亿元左右。 未来的宠物市…

智能宠物饲养系统设计

word完整版可点击如下下载>>>>>>>> 智能宠物饲养系统设计.rar-其它文档类资源-CSDN下载1、资源内容&#xff1a;毕业设计lun-wenword版10000字&#xff1b;开题报告&#xff0c;任务书2、学习目标&#xff1a;快速更多下载资源、学习资料请访问CSDN下…

宠物服务App功能简介

随着时代的变革与发展人们的生活变得越来越好&#xff0c;也变的越来越多样化。物质生活的满足后&#xff0c;人们开始找寻其他的一些兴趣爱好&#xff0c;让自己的生活变的更加多彩&#xff0c;有人种花、有人养鸟、有人养猫、有人养狗等等。不管是养什么都是需要细心照顾才能…

线上宠物领养系统

实现功能 客户端&#xff1a;客户可以查询数据库的宠物信息并根据查询的宠物信息选择自己喜欢的宠物进行领养。 服务器&#xff1a;服务器实现了对管理员相关信息的保存&#xff0c;管理员必须输入正确的用户名和密码才能对数据库信息进行增删改查等操作。服务器也可以直接对数…

软件官网页面模板

此项目由Htmlcss结构搭建而成 里面自适应移动端而做出调整 上代码: 使用了该模板的请将出处表明 项目结构 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" conte…