二叉树算法之字典树(Trie)详细解读
字典树(Trie,也称前缀树或单词查找树)是一种用于快速查找字符串的数据结构,主要应用于字符串集合的高效存储和查找。字典树特别适合处理具有相同前缀的大量字符串集合,比如单词自动补全、拼写检查等场景。
1. 字典树的定义
字典树是一棵多叉树,通常用于存储字符串。树的每个节点代表一个字符,从根节点到某个节点的路径组成一个字符串。字典树的核心思想是利用字符串的公共前缀来减少存储空间和查找时间。
字典树具有以下几个特性:
- 根节点不包含字符,除根节点外每个节点只包含一个字符。
- 从根节点到某个节点的路径表示一个字符串的前缀。
- 每个节点的所有子节点包含的字符都不同。
- 每个叶子节点代表一个字符串的结束。
2. 字典树的结构
字典树由节点构成,每个节点存储以下信息:
- 字符:该节点表示的字符。
- 子节点的引用:指向其子节点的引用(即后续字符)。
- 结束标志:表示从根到该节点的路径是否构成了一个完整的字符串。
每个节点的子节点可以是26个字母(如果是只处理英文小写字母的话),但在实际实现中可以根据需求调整字符集的大小。
3. 字典树的基本操作
字典树支持以下基本操作:
- 插入(Insert):将一个字符串插入到字典树中。
- 查找(Search):判断字典树中是否存在某个字符串。
- 前缀查找(StartsWith):判断字典树中是否存在某个前缀。
3.1 插入操作
插入操作的目的是将一个字符串插入到字典树中。如果该字符串的前缀已经存在于树中,则可以共用已有的节点,否则需要创建新的节点。
步骤:
- 从根节点开始,逐个检查字符串中的字符。
- 对于当前字符,如果在当前节点的子节点中找不到对应的字符节点,则创建一个新的节点。
- 移动到该字符的节点,继续处理下一个字符。
- 重复该过程,直到字符串的所有字符都处理完毕。
- 标记最后一个字符的节点为字符串的结束节点。
时间复杂度:插入操作的时间复杂度为 O(L),其中 L 是要插入的字符串的长度。
3.2 查找操作
查找操作的目的是判断某个字符串是否存在于字典树中。该过程类似于插入操作。
步骤:
- 从根节点开始,逐个检查字符串中的字符。
- 对于每个字符,检查当前节点的子节点中是否存在对应的字符节点。如果不存在,则该字符串不在树中。
- 如果所有字符都找到,并且最后一个字符节点标记为字符串结束,则说明该字符串存在。
时间复杂度:查找操作的时间复杂度为 O(L),其中 L 是要查找的字符串的长度。
3.3 前缀查找操作
前缀查找操作的目的是判断是否存在以某个字符串作为前缀的单词。
步骤:
- 从根节点开始,逐个检查前缀字符串中的字符。
- 对于每个字符,检查当前节点的子节点中是否存在对应的字符节点。如果不存在,则该前缀不在树中。
- 如果前缀中的所有字符都找到,说明字典树中存在以该前缀开头的单词。
时间复杂度:前缀查找操作的时间复杂度为 O(L),其中 L 是前缀的长度。
4. 字典树的实现
下面是一个字典树的Java实现,支持插入、查找和前缀查找操作:
class TrieNode {// 每个节点包含的字符TrieNode[] children = new TrieNode[26]; // 假设只处理小写字母boolean isEndOfWord; // 该节点是否为某个单词的结束public TrieNode() {isEndOfWord = false;for (int i = 0; i < 26; i++) {children[i] = null;}}
}class Trie {private TrieNode root;public Trie() {root = new TrieNode();}// 插入一个字符串public void insert(String word) {TrieNode node = root;for (int i = 0; i < word.length(); i++) {int index = word.charAt(i) - 'a';if (node.children[index] == null) {node.children[index] = new TrieNode();}node = node.children[index];}node.isEndOfWord = true; // 标记字符串结束}// 查找一个字符串public boolean search(String word) {TrieNode node = root;for (int i = 0; i < word.length(); i++) {int index = word.charAt(i) - 'a';if (node.children[index] == null) {return false; // 字符不存在}node = node.children[index];}return node != null && node.isEndOfWord; // 判断是否为字符串结束}// 判断是否存在以某个前缀开头的字符串public boolean startsWith(String prefix) {TrieNode node = root;for (int i = 0; i < prefix.length(); i++) {int index = prefix.charAt(i) - 'a';if (node.children[index] == null) {return false; // 前缀不存在}node = node.children[index];}return true; // 前缀存在}
}public class Main {public static void main(String[] args) {Trie trie = new Trie();trie.insert("apple");System.out.println(trie.search("apple")); // 输出 trueSystem.out.println(trie.search("app")); // 输出 falseSystem.out.println(trie.startsWith("app")); // 输出 truetrie.insert("app");System.out.println(trie.search("app")); // 输出 true}
}
5. 字典树的应用
字典树因其高效的前缀查找和字符串处理能力,广泛应用于以下场景:
- 自动补全:当用户输入部分单词时,可以使用字典树快速找到以该前缀开头的所有单词,从而实现单词补全功能。
- 拼写检查:字典树可以用来构建一个词典,然后快速检查某个单词是否在词典中。
- 多模式匹配:字典树能够有效地进行多个模式的匹配,比如在文本中查找多个单词的出现位置。
- IP 路由查找:字典树的变种(例如 Patricia Trie)常用于网络中的IP路由查找。
6. 字典树的优缺点
优点:
- 高效的前缀匹配:由于节点间的共享特性,字典树能够快速进行前缀查找操作。
- 可扩展性强:可以通过简单的调整字符集大小,来适应不同的字符集(如字母、数字等)。
缺点:
- 空间复杂度高:由于每个节点都需要存储一个完整的子节点数组(如处理26个字母需要26个子节点),在处理大量字符串时可能会占用较多的内存。
- 不适合短字符串存储:在存储短字符串的情况下,字典树的空间利用率较低。
7. 总结
字典树是一种非常适合处理字符串的高效数据结构,特别在前缀匹配和查找方面具有独特的优势。它通过节点的共享,极大减少了冗余的存储空间,同时能在 O(L)时间内完成插入、查找和前缀查找操作。虽然其空间复杂度相对较高,但通过优化,如压缩字典树或使用更紧凑的存储方式,可以提升性
相关文章:
二叉树算法之字典树(Trie)详细解读
字典树(Trie,也称前缀树或单词查找树)是一种用于快速查找字符串的数据结构,主要应用于字符串集合的高效存储和查找。字典树特别适合处理具有相同前缀的大量字符串集合,比如单词自动补全、拼写检查等场景。 1. 字典树的…...
butterfly侧边栏音乐模块
方法1.美观但换页后没法播放 1.blog根目录/source文件夹下新建_data文件夹(如果没有_data文件夹) 2.在刚刚的_data文件夹里创建widget.yml文件 bottom:- class_name: user-musicid_name: user-musicname: 音乐icon: fas fa-heartbeatorder:html: <…...
【论文阅读】Detach and unite: A simple meta-transfer for few-shot learning
分离与联合:一种用于小样本学习的简单元迁移方法 引用:Zheng Y, Zhang X, Tian Z, et al. Detach and unite: A simple meta-transfer for few-shot learning[J]. Knowledge-Based Systems, 2023, 277: 110798. 论文地址:下载地址 论文代码&a…...
Java中的动态代理——介绍与使用示例
Java中的动态代理其实就是一种“代理”模式,在运行时帮我们创建一个“代理对象”,通过这个代理对象可以在不改变原本方法的情况下,做一些额外的事情,比如记录日志、检查权限等。这种代理机制非常灵活和实用,特别是在像…...
微信开发者工具:音乐小程序报错
报错信息 GET http://localhost:3000/1.mp3 net::ERR CONNECTION REFUSED (env: Windows,mp,1.06.2303220;lib:3.6.0) 原因:小程序没有直接获取本地文件,为了提高访问速度,而采用放到网络服务器中网络访问的方式获取文件内容 解决办法&#…...
P2-3与P2-4.【C语言基本数据类型、运算符和表达式】第三节与第四节
讲解视频: P2-3.【基本数据类型、运算符和表达式】第三节 P2-4.【基本数据类型、运算符和表达式】第四节 目录 必备知识与理论 任务实施 必备知识与理论 C语言中把除了控制语句和输入输出以外的几乎所有的基本操作都作为运算符处理。 其运算符和表达式数量之多&a…...
Python | Leetcode Python题解之第492题构造矩形
题目: 题解: class Solution:def constructRectangle(self, area: int) -> List[int]:w int(sqrt(area))while area % w:w - 1return [area // w, w]...
新版vs code + Vue高亮、语法自动补全插件
vs code 版本或及以上 安装以下三个插件插件 Vetur Vue语法支持。包括语法高亮、语法代码提示、语法lint检测 ESLint语法纠错 Prettier 2.左下角设置 3.进行配置 配置内容: {"editor.fontSize": 20,"window.zoomLevel": 1,"workben…...
【优选算法】(第四十五篇)
目录 地图分析(medium) 题目解析 讲解算法原理 编写代码 课程表(medium) 题目解析 讲解算法原理 编写代码 地图分析(medium) 题目解析 1.题目链接:. - 力扣(LeetCode&#…...
自闭症儿童的康复与培养:揭秘有效方法
在生命的广阔画卷中,每一个孩子都是独一无二的色彩,他们带着各自的使命和梦想,踏上人生的旅程。然而,对于自闭症儿童而言,这段旅程似乎更加崎岖和艰难。幸运的是,星贝育园康复中心如同一盏明灯,…...
rom定制系列------小米8澎湃os1.0.28安卓13客户定制固件 刷写以及界面预览
💝💝💝 小米8后置指纹版,机型代码dipper, 官方最终版为12.5.2安卓10的版本。对于一些工作室不太适用。客户需要应用在安卓13的固件。根据客户提供的固件将卡刷改为线刷。并且修改其中客户需求。去除不需要的内置应用以…...
【CTF-SHOW】Web入门 Web14 【editor泄露-详】【var/www/html目录-详】
editor泄露问题通常出现在涉及文件编辑器或脚本编辑器的题目中,尤其是在Web安全或Pwn(系统漏洞挖掘)类别中。editor泄露的本质是由于系统未能妥善处理临时文件、编辑历史或进程信息,导致攻击者可以通过某种途径获取正在编辑的敏感…...
Chrome谷歌浏览器禁止空格下翻页但可以暂停和播放视频脚本js
前提 播放某些网站的视频的时候(不能网页全屏的视频) 会产生空格下翻页但是不能暂停播放视频,解决方案:下载油猴或者脚本猫把这代码填进去 (function() {use strict;document.body.onkeydown function(event) {var e window.event || event;// 检查是否按下空格…...
【笔记】【YOLOv10图像识别】自动识别图片、视频、摄像头、电脑桌面中的花朵学习踩坑
(一)启动 创建环境python3.9 打开此环境终端 (后面的语句操作几乎都在这个终端执行) 输入up主提供的语句:pip install -r requirements.txt 1.下载pytorch网络连接超时 pytorch网址: Start Locally | P…...
H-TCP 的效率和公平性
昨晚带安孩楼下玩耍,用手机 desmos 作了一组 response curve 置于双对数坐标系: 长肥管道的优化思路都很类似,cwnd 增长快一点: BIC TCP:二分查找逼近 capacity;CUBIC TCP:上凸曲线逼近 capa…...
集群与分布式
Cluster(集群)概述 当单独一台主机无法承载现有的用户请求量;或者一台主机因为单一故障导致业务中断的时候,就可以增加服务主机数,这些主机在一起提供服务,就叫集群,而用户所看到的依然是单个的主机,用户并…...
git rebase的常用场景: 交互式变基, 变基和本地分支基于远端分支的变基
文章目录 作用应用场景场景一:交互式变基(合并同一条线上的提交记录) —— git rebase -i HEAD~2场景二:变基(合并分支) —— git rebase [其他分支名称]场景三:本地分支与远端分支的变基 作用 使git的提交记录变得更加简洁 应用场景 场景…...
HttpURLConnection构造请求体传文件
HttpURLConnection构造请求体传文件 在Java中,使用HttpURLConnection构造请求体传输文件,你需要做以下几步: 1、创建URL对象指向你想要请求的资源。 2、通过URL打开连接,转换为HttpURLConnection实例。 3、设置请求方法为POST。 …...
STM32传感器模块编程实践(九) VL53L0X激光红外测距传感器简介及驱动源码
文章目录 一.概要二.VL53L0X测距原理三.VL53L0X主要特性四.VL53L0X硬件参考设计五.模块接线说明六.模块通讯协议介绍七.光学盖玻片介绍八.STM32单片机与VL53L0模块实现距离测量实验1.硬件准备2.软件工程3.软件主要代码4.实验效果 九.小结 一.概要 VL53L0X是一款由ST࿰…...
fastjson注解说明,fastjson注解有那些?fastjson是java的json序列化和反序列化工具包
fastjson注解说明,fastjson注解有那些?fastjson是java的json序列化和反序列化工具包 包版本说明 fastjson请使用1.2.83以上版本,小于这个版本的存在漏洞。 fastjson请使用1.2.83以上版本,小于这个版本的存在漏洞。 fastjson请使用1.2.83以上版本,小于这个版本的存在漏洞…...
【2026必看】临沂销售增长咨询,哪家公司最权威?
在当前竞争激烈的市场环境中,商贸和生产型企业要想实现销售额的稳步增长,选择一家专业的管理咨询公司至关重要。那么,在临沂,哪家公司在销售增长咨询方面最具权威性呢?本文将为您详细解析,并推荐山东润行管…...
在瑞芯微RK3568上,用Qt5+EGL实现零拷贝离屏渲染的完整避坑指南
瑞芯微RK3568嵌入式平台Qt5EGL零拷贝渲染实战解析 引言:嵌入式图形开发的性能瓶颈与突破 在瑞芯微RK3568这类嵌入式平台上开发图形应用时,开发者常常面临一个核心矛盾:既要满足复杂UI渲染的功能需求,又要兼顾有限的硬件资源。传统…...
从Clarke理论到Simulink模块:搞懂无线信道仿真中的‘经典谱’到底是怎么来的
从Clarke理论到Simulink模块:无线信道仿真中的经典多普勒谱解析 当你在Simulink中拖拽"瑞利衰落信道"模块时,是否曾好奇过参数面板里那个勾选"经典谱"的选项背后隐藏着怎样的物理图景?这个看似简单的复选框,实…...
从标注到训练:手把手教你用Labelme制作YOLOv8-Pose可用的关键点数据集
从标注到训练:手把手教你用Labelme制作YOLOv8-Pose可用的关键点数据集 在计算机视觉领域,关键点检测技术正逐渐成为研究热点。无论是人体姿态估计、面部表情识别还是工业质检中的零件定位,准确的关键点检测都是实现这些应用的基础。然而&…...
FPGA图像处理避坑指南:实现CLAHE时,你的直方图统计与插值模块可能踩的这些雷
FPGA图像处理避坑指南:CLAHE实现中的直方图统计与插值模块陷阱解析 第一次在FPGA上实现CLAHE算法时,我盯着屏幕上那些奇怪的边界伪影和忽明忽暗的色块,整整三天没想明白问题出在哪。直到把示波器接到开发板上,才发现直方图统计模块…...
Navicat Premium 17 创建触发器保姆级教程
前言:触发器是MySQL中极具实用性的数据库对象,核心作用是“当表发生INSERT/UPDATE/DELETE操作时,自动执行预设SQL”,无需手动调用、无需程序介入,常用于自动填充时间、数据同步、日志记录、数据校验等场景。Navicat Pr…...
如何比较不同注册商的域名注册价格_如何查看域名的SEO数据和排名信息
如何比较不同注册商的域名注册价格 在互联网时代,域名已经成为网站的“门面”,是网站建设的重要一步。不同注册商的域名注册价格差异较大,如何在保证性价比的前提下选择合适的注册商成为了一个重要的问题。本文将详细探讨如何比较不同注册商…...
性能分析定界(OpenHarmony平台)指南
性能分析定界指南 前置条件 OpenHarmony Next系统前台运行Flutter页面分析工具 DevEco Studio Profiler SmartPerf Flutter线程介绍 Flutter 使用多个线程来完成其必要的工作,图层中仅展示了其中两个线程。你写的所有 Dart 代码都在 UI 线程上运行。尽管你没有直…...
如何在 Laravel Eloquent 中准确检测两个日期时间范围是否重叠
本文详解 laravel 中判断预约时间区间是否重叠的正确逻辑与实现,纠正常见边界条件误判问题,提供简洁可靠的数据库查询方案及完整代码示例。 本文详解 laravel 中判断预约时间区间是否重叠的正确逻辑与实现,纠正常见边界条件误判问题&…...
终极指南:如何通过ComfyUI-Custom-Scripts大幅提升AI绘画工作效率
终极指南:如何通过ComfyUI-Custom-Scripts大幅提升AI绘画工作效率 【免费下载链接】ComfyUI-Custom-Scripts Enhancements & experiments for ComfyUI, mostly focusing on UI features 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-Custom-Scripts …...
