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

二叉树算法之字典树(Trie)详细解读

字典树(Trie,也称前缀树或单词查找树)是一种用于快速查找字符串的数据结构,主要应用于字符串集合的高效存储和查找。字典树特别适合处理具有相同前缀的大量字符串集合,比如单词自动补全、拼写检查等场景。

1. 字典树的定义

字典树是一棵多叉树,通常用于存储字符串。树的每个节点代表一个字符,从根节点到某个节点的路径组成一个字符串。字典树的核心思想是利用字符串的公共前缀来减少存储空间和查找时间。

字典树具有以下几个特性:

  1. 根节点不包含字符,除根节点外每个节点只包含一个字符。
  2. 从根节点到某个节点的路径表示一个字符串的前缀
  3. 每个节点的所有子节点包含的字符都不同
  4. 每个叶子节点代表一个字符串的结束

2. 字典树的结构

字典树由节点构成,每个节点存储以下信息:

  • 字符:该节点表示的字符。
  • 子节点的引用:指向其子节点的引用(即后续字符)。
  • 结束标志:表示从根到该节点的路径是否构成了一个完整的字符串。

每个节点的子节点可以是26个字母(如果是只处理英文小写字母的话),但在实际实现中可以根据需求调整字符集的大小。

3. 字典树的基本操作

字典树支持以下基本操作:

  • 插入(Insert):将一个字符串插入到字典树中。
  • 查找(Search):判断字典树中是否存在某个字符串。
  • 前缀查找(StartsWith):判断字典树中是否存在某个前缀。
3.1 插入操作

插入操作的目的是将一个字符串插入到字典树中。如果该字符串的前缀已经存在于树中,则可以共用已有的节点,否则需要创建新的节点。

步骤

  1. 从根节点开始,逐个检查字符串中的字符。
  2. 对于当前字符,如果在当前节点的子节点中找不到对应的字符节点,则创建一个新的节点。
  3. 移动到该字符的节点,继续处理下一个字符。
  4. 重复该过程,直到字符串的所有字符都处理完毕。
  5. 标记最后一个字符的节点为字符串的结束节点。

时间复杂度:插入操作的时间复杂度为 O(L),其中 L 是要插入的字符串的长度。

3.2 查找操作

查找操作的目的是判断某个字符串是否存在于字典树中。该过程类似于插入操作。

步骤

  1. 从根节点开始,逐个检查字符串中的字符。
  2. 对于每个字符,检查当前节点的子节点中是否存在对应的字符节点。如果不存在,则该字符串不在树中。
  3. 如果所有字符都找到,并且最后一个字符节点标记为字符串结束,则说明该字符串存在。

时间复杂度:查找操作的时间复杂度为 O(L),其中 L 是要查找的字符串的长度。

3.3 前缀查找操作

前缀查找操作的目的是判断是否存在以某个字符串作为前缀的单词。

步骤

  1. 从根节点开始,逐个检查前缀字符串中的字符。
  2. 对于每个字符,检查当前节点的子节点中是否存在对应的字符节点。如果不存在,则该前缀不在树中。
  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. 字典树的应用

字典树因其高效的前缀查找和字符串处理能力,广泛应用于以下场景:

  1. 自动补全:当用户输入部分单词时,可以使用字典树快速找到以该前缀开头的所有单词,从而实现单词补全功能。
  2. 拼写检查:字典树可以用来构建一个词典,然后快速检查某个单词是否在词典中。
  3. 多模式匹配:字典树能够有效地进行多个模式的匹配,比如在文本中查找多个单词的出现位置。
  4. IP 路由查找:字典树的变种(例如 Patricia Trie)常用于网络中的IP路由查找。

6. 字典树的优缺点

优点:
  • 高效的前缀匹配:由于节点间的共享特性,字典树能够快速进行前缀查找操作。
  • 可扩展性强:可以通过简单的调整字符集大小,来适应不同的字符集(如字母、数字等)。
缺点:
  • 空间复杂度高:由于每个节点都需要存储一个完整的子节点数组(如处理26个字母需要26个子节点),在处理大量字符串时可能会占用较多的内存。
  • 不适合短字符串存储:在存储短字符串的情况下,字典树的空间利用率较低。

7. 总结

字典树是一种非常适合处理字符串的高效数据结构,特别在前缀匹配和查找方面具有独特的优势。它通过节点的共享,极大减少了冗余的存储空间,同时能在 O(L)时间内完成插入、查找和前缀查找操作。虽然其空间复杂度相对较高,但通过优化,如压缩字典树或使用更紧凑的存储方式,可以提升性

相关文章:

二叉树算法之字典树(Trie)详细解读

字典树&#xff08;Trie&#xff0c;也称前缀树或单词查找树&#xff09;是一种用于快速查找字符串的数据结构&#xff0c;主要应用于字符串集合的高效存储和查找。字典树特别适合处理具有相同前缀的大量字符串集合&#xff0c;比如单词自动补全、拼写检查等场景。 1. 字典树的…...

butterfly侧边栏音乐模块

方法1.美观但换页后没法播放 1.blog根目录/source文件夹下新建_data文件夹&#xff08;如果没有_data文件夹&#xff09; 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

分离与联合&#xff1a;一种用于小样本学习的简单元迁移方法 引用&#xff1a;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. 论文地址&#xff1a;下载地址 论文代码&a…...

Java中的动态代理——介绍与使用示例

Java中的动态代理其实就是一种“代理”模式&#xff0c;在运行时帮我们创建一个“代理对象”&#xff0c;通过这个代理对象可以在不改变原本方法的情况下&#xff0c;做一些额外的事情&#xff0c;比如记录日志、检查权限等。这种代理机制非常灵活和实用&#xff0c;特别是在像…...

微信开发者工具:音乐小程序报错

报错信息 GET http://localhost:3000/1.mp3 net::ERR CONNECTION REFUSED (env: Windows,mp,1.06.2303220;lib:3.6.0) 原因&#xff1a;小程序没有直接获取本地文件&#xff0c;为了提高访问速度&#xff0c;而采用放到网络服务器中网络访问的方式获取文件内容 解决办法&#…...

P2-3与P2-4.【C语言基本数据类型、运算符和表达式】第三节与第四节

讲解视频&#xff1a; P2-3.【基本数据类型、运算符和表达式】第三节 P2-4.【基本数据类型、运算符和表达式】第四节 目录 必备知识与理论 任务实施 必备知识与理论 C语言中把除了控制语句和输入输出以外的几乎所有的基本操作都作为运算符处理。 其运算符和表达式数量之多&a…...

Python | Leetcode Python题解之第492题构造矩形

题目&#xff1a; 题解&#xff1a; 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.进行配置 配置内容&#xff1a; {"editor.fontSize": 20,"window.zoomLevel": 1,"workben…...

【优选算法】(第四十五篇)

目录 地图分析&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 课程表&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 地图分析&#xff08;medium&#xff09; 题目解析 1.题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#…...

自闭症儿童的康复与培养:揭秘有效方法

在生命的广阔画卷中&#xff0c;每一个孩子都是独一无二的色彩&#xff0c;他们带着各自的使命和梦想&#xff0c;踏上人生的旅程。然而&#xff0c;对于自闭症儿童而言&#xff0c;这段旅程似乎更加崎岖和艰难。幸运的是&#xff0c;星贝育园康复中心如同一盏明灯&#xff0c;…...

rom定制系列------小米8澎湃os1.0.28安卓13客户定制固件 刷写以及界面预览

&#x1f49d;&#x1f49d;&#x1f49d; 小米8后置指纹版&#xff0c;机型代码dipper&#xff0c; 官方最终版为12.5.2安卓10的版本。对于一些工作室不太适用。客户需要应用在安卓13的固件。根据客户提供的固件将卡刷改为线刷。并且修改其中客户需求。去除不需要的内置应用以…...

【CTF-SHOW】Web入门 Web14 【editor泄露-详】【var/www/html目录-详】

editor泄露问题通常出现在涉及文件编辑器或脚本编辑器的题目中&#xff0c;尤其是在Web安全或Pwn&#xff08;系统漏洞挖掘&#xff09;类别中。editor泄露的本质是由于系统未能妥善处理临时文件、编辑历史或进程信息&#xff0c;导致攻击者可以通过某种途径获取正在编辑的敏感…...

Chrome谷歌浏览器禁止空格下翻页但可以暂停和播放视频脚本js

前提 播放某些网站的视频的时候(不能网页全屏的视频) 会产生空格下翻页但是不能暂停播放视频&#xff0c;解决方案:下载油猴或者脚本猫把这代码填进去 (function() {use strict;document.body.onkeydown function(event) {var e window.event || event;// 检查是否按下空格…...

【笔记】【YOLOv10图像识别】自动识别图片、视频、摄像头、电脑桌面中的花朵学习踩坑

&#xff08;一&#xff09;启动 创建环境python3.9 打开此环境终端 &#xff08;后面的语句操作几乎都在这个终端执行&#xff09; 输入up主提供的语句&#xff1a;pip install -r requirements.txt 1.下载pytorch网络连接超时 pytorch网址&#xff1a; Start Locally | P…...

H-TCP 的效率和公平性

昨晚带安孩楼下玩耍&#xff0c;用手机 desmos 作了一组 response curve 置于双对数坐标系&#xff1a; 长肥管道的优化思路都很类似&#xff0c;cwnd 增长快一点&#xff1a; BIC TCP&#xff1a;二分查找逼近 capacity&#xff1b;CUBIC TCP&#xff1a;上凸曲线逼近 capa…...

集群与分布式

Cluster(集群)概述 当单独一台主机无法承载现有的用户请求量&#xff1b;或者一台主机因为单一故障导致业务中断的时候&#xff0c;就可以增加服务主机数&#xff0c;这些主机在一起提供服务&#xff0c;就叫集群&#xff0c;而用户所看到的依然是单个的主机&#xff0c;用户并…...

git rebase的常用场景: 交互式变基, 变基和本地分支基于远端分支的变基

文章目录 作用应用场景场景一&#xff1a;交互式变基(合并同一条线上的提交记录) —— git rebase -i HEAD~2场景二&#xff1a;变基(合并分支) —— git rebase [其他分支名称]场景三&#xff1a;本地分支与远端分支的变基 作用 使git的提交记录变得更加简洁 应用场景 场景…...

HttpURLConnection构造请求体传文件

HttpURLConnection构造请求体传文件 在Java中&#xff0c;使用HttpURLConnection构造请求体传输文件&#xff0c;你需要做以下几步&#xff1a; 1、创建URL对象指向你想要请求的资源。 2、通过URL打开连接&#xff0c;转换为HttpURLConnection实例。 3、设置请求方法为POST。 …...

STM32传感器模块编程实践(九) VL53L0X激光红外测距传感器简介及驱动源码

文章目录 一.概要二.VL53L0X测距原理三.VL53L0X主要特性四.VL53L0X硬件参考设计五.模块接线说明六.模块通讯协议介绍七.光学盖玻片介绍八.STM32单片机与VL53L0模块实现距离测量实验1.硬件准备2.软件工程3.软件主要代码4.实验效果 九.小结 一.概要 VL53L0X是一款由ST&#xff0…...

fastjson注解说明,fastjson注解有那些?fastjson是java的json序列化和反序列化工具包

fastjson注解说明,fastjson注解有那些?fastjson是java的json序列化和反序列化工具包 包版本说明 fastjson请使用1.2.83以上版本,小于这个版本的存在漏洞。 fastjson请使用1.2.83以上版本,小于这个版本的存在漏洞。 fastjson请使用1.2.83以上版本,小于这个版本的存在漏洞…...

VIT:论文关键点解读与常见疑问

VIT贡献点&#xff1a; 1. 首次将 Transformer 应用于图像识别任务 核心贡献&#xff1a;ViT 论文的最大贡献是提出将原本用于自然语言处理&#xff08;NLP&#xff09;的 Transformer 架构成功应用于图像任务。传统的计算机视觉模型主要依赖卷积神经网络&#xff08;CNN&…...

ArcGIS无插件加载(无偏移)在线天地图高清影像与街道地图指南

在地理信息系统&#xff08;GIS&#xff09;的应用中&#xff0c;加载高清影像与街道地图对于地图制图、影像查阅、空间数据分析等工作至关重要。天地图作为官方出品的地图服务&#xff0c;以其标准的数据、较快的影像更新速度等特点受到广泛欢迎。以下是如何在ArcGIS中无插件加…...

工业相机选型(自用笔记)

可参考链接&#xff1a; 相机和镜头选型需要注意哪些问题_靶面尺寸-CSDN博客 工业相机选型方法_ccd工业相机选型步骤-CSDN博客 1、相机 1.1 传感器类型(CCD/CMOS) CCD相机&#xff1a; 1&#xff09;目标是运动的则优先考虑。 2&#xff09;需要高质量图像&#xff0c;如进行…...

【网安笔记】4种拒绝服务攻击

目录 一、SYN Flood 攻击 二、UDP Flood 攻击 三、ICMP Flood 攻击 四、HTTP Flood 攻击 拒绝服务攻击&#xff08;Denial of Service attack&#xff0c;简称 DoS 攻击&#xff09;是指攻击者通过向目标服务器或网络发送大量的请求&#xff0c;使其资源耗尽&#xff0c;无…...

WPF 的组件数据绑定详解

Windows Presentation Foundation&#xff08;WPF&#xff09;是微软推出的一种用于构建 Windows 应用程序的 UI 框架。WPF 提供了强大的数据绑定功能&#xff0c;能够轻松地将 UI 控件与数据源连接&#xff0c;从而实现富用户体验&#xff0c;分离前端设计和业务逻辑。本文将详…...

房子,它或许是沃土

刚成家&#xff0c;来客时&#xff0c;它是客房 成家后&#xff0c;没小孩&#xff0c;它是书房 有小孩&#xff0c;未分房&#xff0c;它暂且是书房 孩子大些&#xff0c;它是孩子们埋下梦想种子&#xff0c;生根发芽的地方...

【Golang】Go语言http编程底层逻辑实现原理与实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…...

SOLIDWORKS参数化软件

在产品设计和工程领域&#xff0c;参数化设计是一种革命性的方法&#xff0c;它允许设计者通过定义一系列规则和关系来创建和修改模型。参数化设计的核心在于将设计过程分解为一系列可调整的参数&#xff0c;如尺寸、形状、材料属性等&#xff0c;这些参数之间通过数学关系相互…...

上位机开发常用技术 C# Task 线程 开始,暂停,继续,停止

上位机开发中一定会用到的技术就是 设备的线程开始运行执行生产流程&#xff0c;在生产过程中会有要打开安全门或暂停设备动作&#xff0c;人为去排除设备小问题的时就要用到暂停功能&#xff0c;问题排除后设备继续运行&#xff0c;生产完成后设备停止。 这些操作是上位机开发…...

MySQL 密码忘记了怎么办?

在使用 MySQL 的过程中&#xff0c;有时候我们可能会忘记密码。别担心&#xff0c;本文将详细介绍在 Windows 系统下如何重新设置 MySQL 密码。 一、停止 MySQL 服务 打开“服务”窗口&#xff0c;可以通过在 Windows 搜索栏中输入“服务”来找到并打开它。在服务列表中找到“…...