二叉树算法之字典树(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以上版本,小于这个版本的存在漏洞…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...
论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...
