当前位置: 首页 > news >正文

数据结构:字典树(前缀树,Trie树),压缩字典树(Radix)

字典树Trie Tree

字典树也称前缀树,Trie树。在 Elasticsearch 的倒排索引中用的也是 Trie 树。是一种针对字符串进行维护的数据结构。

字典树是对词典的一种存储方式,这个词典中的每个“单词”就是从根节点出发一直到某一个目标节点的路径,路径中每个字母连起来就是一个单词。因此它能利用字符串的公共前缀来节省存储空间。

在这里插入图片描述

红色代表有单词在这里结束,因此需要有个标记。上图可以匹配的字符串有:

a
bz
bd
bdjk
bg
ct
cu
dk

具体实现

package mainimport "fmt"type Node struct {nodeId int  // 节点的全局IDexist  bool // 是否有单词在这里结束
}// 255 表示每个节点最多有255个子节点,因为 ASCII 码目前是两个字节,
// 这样做会有一定的空间浪费,但是便于理解,也可以进一步优化。
type Nodes [255]Node// 每个子节点都是数组结构,最终存储到一个map中。
// 层层查找:nodeId -> indexId -> nodeId -> indexId ->...
type Tree struct {nodes         map[int]NodescurrentNodeId int // 自增ID
}func (tree *Tree) insert(str string) {var parentNode Nodefor i := 0; i < len(str); i++ {subIndex := str[i]if _, ok := tree.nodes[parentNode.nodeId]; !ok {var subNode Nodestree.nodes[parentNode.nodeId] = subNode}nds := tree.nodes[parentNode.nodeId]var needUpdate boolif nds[subIndex].nodeId == 0 {tree.currentNodeId++nds[subIndex].nodeId = tree.currentNodeIdneedUpdate = true}if i == len(str)-1 {nds[subIndex].exist = trueneedUpdate = true}if needUpdate == true {tree.nodes[parentNode.nodeId] = nds}// fmt.Println(string(subIndex), nds[subIndex]) // 调试输出parentNode = nds[subIndex]}
}func (tree *Tree) Exist(str string) bool {var parentNode Nodefor i := 0; i < len(str); i++ {subIndex := str[i]if _, ok := tree.nodes[parentNode.nodeId]; !ok {return false}nds := tree.nodes[parentNode.nodeId]if nds[subIndex].nodeId == 0 {return false}parentNode = nds[subIndex]}return parentNode.exist
}func main() {tree := &Tree{nodes: make(map[int]Nodes),}tree.insert("abcdefg")tree.insert("ab")tree.insert("123456789")tree.insert("123456")fmt.Println(tree.Exist("ab"))        // truefmt.Println(tree.Exist("abc"))       // falsefmt.Println(tree.Exist("123456789")) // truefmt.Println(tree.Exist("123456"))    // true
}
压缩字典树 Radix Tree

Radix树,即基数树,也称压缩字典树,是一种提供key-value存储查找的数据结构。radix tree常用于快速查找的场景中,例如:redis中存储slot对应的key信息、内核中使用radix tree管理数据结构、大多数http的router通过radix管理路由。Radix树在Trie Tree(字典树)的原理上优化过来的。

虽然Trie Tree具有比较高的查询效率,但是从上图可以看到,有许多结点只有一个子结点。这种情况是不必要的,不但影响了查询效率(增加了树的高度),主要是浪费了存储空间。完全可以将这些结点合并为一个结点,这就是Radix树的由来。Radix树将只有一个子节点的中间节点将被压缩,使之具有更加合理的内存使用和查询的效率。

在这里插入图片描述

相关文章:

数据结构:字典树(前缀树,Trie树),压缩字典树(Radix)

字典树Trie Tree 字典树也称前缀树&#xff0c;Trie树。在 Elasticsearch 的倒排索引中用的也是 Trie 树。是一种针对字符串进行维护的数据结构。 字典树是对词典的一种存储方式&#xff0c;这个词典中的每个“单词”就是从根节点出发一直到某一个目标节点的路径&#xff0c;…...

前端学习系列之html

目录 初识html 发展史 优势 W3C 标准 地址 格式 网页基本标签 标题标签 段落标签 换行标签 水平线标签 字体样式 注释和特殊符号 特殊符号 图像、超链接 图像 常见图像格式 格式 超链接 格式 重要属性 href&#xff1a;规定链接指向的页面的 URL target…...

Star History 十月开源精选 |AI for Postgres

在 2023 年 Stack Overflow 开发者调查中&#xff0c;Postgres 顶替了 MySQL 被评为最受欢迎的数据库。一个重要因素应该是 Postgres 支持扩展&#xff1a;可扩展的架构 Postgres 仍然由社区拥有&#xff0c;Postgres 生态近年来蓬勃发展。 扩展可以看作是内置功能&#xff0c…...

网络运维与网络安全 学习笔记2023.11.23

网络运维与网络安全 学习笔记 第二十四天 今日目标 VRRP负载均衡、BFD原理与配置、BFD典型应用 DHCP工作原理、全局模式DHCP VRRP负载均衡 VRRP单组缺陷 每网段存在一个VRRP组&#xff0c;缺点如下&#xff1a; 主网关数据转发压力大 备份网关不转发任何数据 网络设备利用…...

红黑树(万字图文详解)

红黑树 1. 红黑树的概念2. 红黑树的性质3. 红黑树节点的定义4. 红黑树结构5. 红黑树的插入操作5.1 按照二叉搜索的树规则插入新节点5.2 检测新节点插入后&#xff0c;红黑树的性质是否造到破坏5.2.1 情况一: cur为红&#xff0c;p为红&#xff0c;g为黑&#xff0c;u存在且为红…...

Kotlin学习——kt入门合集博客 kt里的委派模式Delegation kt里的特性

Kotlin 是一门现代但已成熟的编程语言&#xff0c;旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作&#xff0c;并提供了多种方式在多个平台间复用代码&#xff0c;以实现高效编程。 https://play.kotlinlang.org/byExample/01_introduction/02_Functio…...

数据挖掘 朴素贝叶斯

直入正题&#xff0c;直接看代码&#xff1a; 这是一段判断是不是藏话的代码 import numpy as np# 数据采集&#xff08;定义函数加载数据集&#xff09; def load_dataset():sent_list [[my, name, is, Devin],[you, are, stupid],[my, boyfriend, is, SB],[you, looks, ver…...

UI自动化测试工具有哪些优势?

UI自动化测试工具通过提高测试效率、覆盖率&#xff0c;减少测试时间和成本&#xff0c;以及支持持续集成等方式&#xff0c;为软件开发团队提供了一系列重要的优势&#xff0c;有助于提升软件质量和开发效率。 自动化执行&#xff1a;UI自动化测试工具可以模拟用户与应用程序的…...

【论文阅读笔记】InstructDiffusion: A Generalist Modeling Interface for Vision Tasks

【论文阅读笔记】StyleAvatar3D: Leveraging Image-Text Diffusion Models for High-Fidelity 3D Avatar Generation 论文阅读笔记论文信息引言动机挑战 方法结果 关键发现相关工作1. 视觉语言基础模型2. 视觉通用模型 方法/模型视觉任务的统一说明训练数据构建网络结构 实验设…...

笔记62:注意力汇聚 --- Nadaraya_Watson 核回归

本地笔记地址&#xff1a;D:\work_file\&#xff08;4&#xff09;DeepLearning_Learning\03_个人笔记\3.循环神经网络\第10章&#xff1a;动手学深度学习~注意力机制 a a a a a a a a a a a a a a a a...

给定一个n×n的方阵,本题要求计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。

7-5 矩阵运算 分数 20 全屏浏览题目 切换布局 作者 C课程组 单位 浙江大学 给定一个nn的方阵&#xff0c;本题要求计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线。 输入格式: 输入第一行给出正整数n&#xff08;…...

Go语言的学习笔记3——Go语言项目布局

Go 1.11 版本开始引入 go.mod 和 go.sum 以支持Go Module构建机制&#xff0c;而这种机制成为官方的依赖包管理方式。 现在Go可执行程序项目的典型布局如下所示&#xff1a; exe-layout ├── cmd/ │ ├── app1/ │ │ └── main.go │ └── app2/ │ └…...

70-76-堆、贪心算法

LeetCode 热题 100 文章目录 LeetCode 热题 100堆70. 中等-数组中的第K个最大元素71. 中等-前K个高频元素72. 困难-数据流中的中位数 贪心算法73. 简单-买卖股票的最佳时机74. 中等-跳跃游戏75. 中等-跳跃游戏II76. 中等-划分字母区间 本文存储我刷题的笔记。 堆 70. 中等-数组…...

Qt Network

Qt Network Qt Network为使用TCP/IP的应用程序编程提供了一组API。各种C++类处理诸如请求、cookies和通过HTTP发送数据之类的操作。 标题使用模块 使用Qt模块需要直接或通过其他依赖项链接到模块库。一些构建工具对此有专门的支持,包括CMake和qmake. 标题使用CMake构建 使…...

Win10电脑用U盘重装系统的步骤

在Win10电脑中&#xff0c;用户遇到了无法解决的系统问题&#xff0c;用户这时候就可以考虑重装Win10系统&#xff0c;这样即可轻松解决问题&#xff0c;从而满足自己的操作需求。接下来小编给大家详细介绍关于Win10电脑中用U盘重装系统的教程步骤。 准备工作 1. 一台正常联网可…...

安防视频监控/磁盘阵列/集中云存储平台EasyCVR设备录像保活不生效原因是什么?该如何解决?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…...

【JDK21】详解虚拟线程

目录 1.概述 2.虚拟线程是为了解决哪些问题 2.1.线程切换的巨大代价 2.2.哪些情况会造成线程的切换 2.3.线程资源是有限的 3.虚拟线程 4.适用场景 1.概述 你发任你发&#xff0c;我用JAVA8&#xff1f;JDK21可能要对这句话say no了。 现在Oracle JDK是每4个版本&#x…...

UE5 - 虚幻引擎各模块流程图

来自虚幻官方的一些资料&#xff0c;分享一下&#xff1b; 一些模块的流程图&#xff0c;比如动画模块&#xff1a; 或角色相关流程&#xff1a; 由于图片比较大&#xff0c;上传到了网络&#xff0c;可自取&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1BQ2KiuP08c…...

vue3实现element table缓存滚动条

背景 对于后台管理系统&#xff0c;数据的展示形式大多都是通过表格&#xff0c;常常会出现的一种场景&#xff0c;从表格跳到二级页面&#xff0c;再返回上一页时&#xff0c;需要缓存当前的页码和滚动条的位置&#xff0c;以为使用keep-alive就能实现这两种诉求&#xff0c;…...

flutter布局详解及代码示例(下)

布局 基本布局 GridView&#xff08;二维滚动列表&#xff09;&#xff1a;比ListView多了一个方向的数据填充。ListBody&#xff08;滚动列表&#xff09;&#xff1a;相比ListView&#xff0c;没有回收复用&#xff0c;简单易用。Table&#xff08;表格布局&#xff09;&am…...

C++技术岗面试经验总结

&#x1f3ac; 胖咕噜的稞达鸭&#xff1a;个人主页&#x1f525; 个人专栏: 《数据结构》《C初阶高阶》 《Linux系统学习》 《算法日记》⛺️技术的杠杆&#xff0c;撬动整个世界! 1. 右值引用和左值引用的区别 左值是我们平常使用的函数对象&#xff0c;表达式结束后依旧存在…...

牛批了,大佬汉化版,非常实用

今天给大家推荐一款U盘容量检测工具&#xff0c;一款是注册表修复工具&#xff0c;有需要的小伙伴可以下载收藏。 第一款&#xff1a;validrive 市面上的U盘很多是假冒伪劣产品&#xff0c;有的U盘标着1T或者2T的存储空间&#xff0c;但实际上可能只有32G或者64G。 想要知道到底…...

PyTorch 2.9镜像入门:无需配置,直接开启GPU加速

PyTorch 2.9镜像入门&#xff1a;无需配置&#xff0c;直接开启GPU加速 1. 为什么选择PyTorch 2.9镜像 深度学习开发环境配置一直是让新手头疼的问题&#xff0c;特别是GPU驱动的安装和CUDA环境的配置。PyTorch 2.9镜像解决了这个痛点&#xff0c;它预装了完整的PyTorch 2.9环…...

像素幻梦·创意工坊应用场景:复古游戏资源批量生成与风格化迁移实战

像素幻梦创意工坊应用场景&#xff1a;复古游戏资源批量生成与风格化迁移实战 1. 像素艺术生成的新纪元 在独立游戏开发领域&#xff0c;像素艺术资源制作一直是个耗时费力的过程。传统方法需要美术师逐帧绘制&#xff0c;一个简单的角色动画可能需要数百张图片。Pixel Dream…...

如何将Rust二进制文件大小减少70%:min-sized-rust与主流优化方案全对比

如何将Rust二进制文件大小减少70%&#xff1a;min-sized-rust与主流优化方案全对比 【免费下载链接】min-sized-rust &#x1f980; How to minimize Rust binary size &#x1f4e6; https://github.com/johnthagen/min-sized-rust 项目地址: https://gitcode.com/gh_mirror…...

REFramework终极指南:让RE引擎游戏体验焕然一新的完整解决方案

REFramework终极指南&#xff1a;让RE引擎游戏体验焕然一新的完整解决方案 【免费下载链接】REFramework Mod loader, scripting platform, and VR support for all RE Engine games 项目地址: https://gitcode.com/GitHub_Trending/re/REFramework REFramework是专为RE…...

伊朗媒体:美军试图炸死在伊朗失联飞行员

新华社德黑兰4月5日电 伊朗塔斯尼姆通讯社5日凌晨报道称&#xff0c;美军搜救被击落战机的一名飞行员无果&#xff0c;试图通过空袭其在伊朗的可能藏身之处将其炸死。报道援引一名伊朗军方消息人士的话说&#xff0c;4日夜间至5日凌晨&#xff0c;美军出动战机&#xff0c;轰炸…...

WarcraftHelper:经典游戏现代重生的兼容性解决方案

WarcraftHelper&#xff1a;经典游戏现代重生的兼容性解决方案 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 让魔兽争霸III完美适配Windows 10/11系…...

Linux 软件安装没你想的那么简单:为什么有的软件能直接跑,有的非装不可?

Linux 软件安装没你想的那么简单&#xff1a;为什么有的软件能直接跑&#xff0c;有的非装不可&#xff1f; 很多人刚接触 Linux 的时候&#xff0c;对“安装软件”这件事有点迷。 在 Windows 上&#xff0c;大家已经习惯了&#xff1a; 双击一个 exe一路“下一步”软件出现在桌…...

SEO_为什么你的SEO策略无效?常见原因与解决办法(372 )

SEO策略无效的常见原因 在当今数字化时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;是网站流量和业务增长的关键。不少企业在实施SEO策略后&#xff0c;却发现效果并不理想。为什么你的SEO策略无效&#xff1f;我们将从多个角度分析常见原因&#xff0c;并给出相应…...