二叉树算法之字典树(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以上版本,小于这个版本的存在漏洞…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
