Java手写Trie树和Trie树应用拓展案例
Java手写Trie树和Trie树应用拓展案例
1. 算法思维导图
以下是使用mermaid代码表示的Trie树的实现原理:
Trie树,也称为字典树或前缀树,是一种用于高效存储和搜索字符串集合的数据结构。它的核心思想是利用字符串的公共前缀来节省存储空间和搜索时间。
Trie树的基本结构是一个树形结构,其中每个节点表示一个字符。根节点为空字符,每个节点的子节点表示下一个字符。通过从根节点到叶子节点的路径,可以得到一个完整的字符串。
Trie树的特点如下:
- 每个节点都包含一个字符和一个标记,标记表示以该节点为结尾的字符串是否存在。
- 从根节点到任意节点的路径表示一个字符串。
- 每个节点的子节点是按照字符的顺序排列的,即子节点的字符是有序的。
- 任意节点的子节点可能为空,表示该节点没有对应的字符。
Trie树的主要操作包括插入、搜索和前缀搜索:
- 插入操作:从根节点开始,依次将字符串的每个字符插入到Trie树中。如果某个字符在当前节点的子节点中不存在,则创建一个新的节点,并将其加入到当前节点的子节点中。最后将插入的字符串的最后一个字符节点标记为结束节点。
- 搜索操作:从根节点开始,依次遍历字符串的每个字符。如果某个字符在当前节点的子节点中不存在,则说明字符串不存在于Trie树中。如果遍历完字符串后,当前节点的结束节点标记为true,则说明字符串存在于Trie树中。
- 前缀搜索操作:从根节点开始,依次遍历字符串的每个字符。如果某个字符在当前节点的子节点中不存在,则说明不存在以该字符串为前缀的字符串。如果遍历完字符串后,当前节点存在子节点,则说明存在以该字符串为前缀的字符串。
Trie树的时间复杂度如下:
- 插入操作的时间复杂度为O(n),其中n为字符串的长度。
- 搜索操作的时间复杂度为O(n),其中n为字符串的长度。
- 前缀搜索操作的时间复杂度为O(m),其中m为前缀字符串的长度。
Trie树的空间复杂度取决于存储的字符串数量和字符串的长度。在最坏情况下,Trie树的空间复杂度为O(n * m),其中n为字符串数量,m为字符串的平均长度。但是,由于Trie树可以共享公共前缀,它通常比其他数据结构更节省空间。
Trie树在许多应用中都有广泛的应用,如搜索引擎、拼写检查、自动补全等。它可以高效地存储和搜索大量的字符串,并且具有较低的时间复杂度。
2. 该算法的手写必要性和市场调查
Trie树是一种高效的数据结构,用于存储和搜索字符串集合。它具有以下特点:
- 能够快速插入和搜索字符串,时间复杂度为O(m),其中m为字符串的长度。
- 能够高效地查找具有相同前缀的字符串。
- 能够节省内存空间,适用于存储大量字符串的场景。
Trie树在许多领域都有广泛的应用,如字符串匹配、自动补全、拼写检查等。它在搜索引擎、编译器、文本编辑器等软件中都有重要的应用。
3. 该算法的详细介绍和步骤
3.1 Trie树的数据结构
Trie树是一种树状数据结构,每个节点代表一个字符,从根节点到叶子节点的路径表示一个完整的字符串。每个节点包含一个字符和若干子节点,子节点通过字符进行索引。根节点不包含字符,其他节点包含一个字符。
3.2 Trie树的实现步骤
以下是Trie树的实现步骤:
- 创建Trie树的节点类
TrieNode
,包含一个字符和一个布尔变量表示是否是字符串的结束字符,以及一个哈希表用于存储子节点。 - 创建Trie树的类
Trie
,包含一个根节点。 - 实现
Trie
类的insert
方法,用于插入一个字符串到Trie树中。- 从根节点开始,依次遍历字符串的每个字符。
- 如果当前字符不存在于当前节点的子节点中,则创建一个新的节点,并将其加入到当前节点的子节点中。
- 将当前节点指向新创建的节点。
- 如果遍历完字符串后,将当前节点的结束字符标记为true。
- 实现
Trie
类的search
方法,用于搜索一个字符串是否存在于Trie树中。- 从根节点开始,依次遍历字符串的每个字符。
- 如果当前字符不存在于当前节点的子节点中,则返回false。
- 将当前节点指向下一个字符对应的子节点。
- 如果遍历完字符串后,返回当前节点的结束字符标记。
- 实现
Trie
类的startsWith
方法,用于判断是否存在以指定字符串为前缀的字符串。- 从根节点开始,依次遍历字符串的每个字符。
- 如果当前字符不存在于当前节点的子节点中,则返回false。
- 将当前节点指向下一个字符对应的子节点。
- 如果遍历完字符串后,返回true。
4. 该算法的手写实现总结和思维拓展
通过手写实现Trie树,我们深入理解了Trie树的原理和实现细节。Trie树是一种非常有用的数据结构,可以高效地存储和搜索字符串集合。它在许多应用中都有广泛的应用,如搜索引擎、拼写检查、自动补全等。
思维拓展:除了基本的插入、搜索和前缀搜索功能,我们还可以对Trie树进行一些扩展,如删除字符串、计算Trie树中字符串的个数等。这些拓展功能可以进一步提升Trie树的实用性和灵活性。
5. 该算法的完整代码
以下是Java实现的Trie树的完整代码:
import java.util.HashMap;
import java.util.Map;class TrieNode {private char c;private boolean isEnd;private Map<Character, TrieNode> children;public TrieNode(char c) {this.c = c;this.isEnd = false;this.children = new HashMap<>();}public char getChar() {return c;}public boolean isEnd() {return isEnd;}public void setEnd(boolean isEnd) {this.isEnd = isEnd;}public TrieNode getChild(char c) {return children.get(c);}public void addChild(char c, TrieNode node) {children.put(c, node);}
}class Trie {private TrieNode root;public Trie() {root = new TrieNode('\0');}public void insert(String word) {TrieNode node = root;for (char c : word.toCharArray()) {if (!node.getChild(c)) {TrieNode newNode = new TrieNode(c);node.addChild(c, newNode);}node = node.getChild(c);}node.setEnd(true);}public boolean search(String word) {TrieNode node = root;for (char c : word.toCharArray()) {if (!node.getChild(c)) {return false;}node = node.getChild(c);}return node.isEnd();}public boolean startsWith(String prefix) {TrieNode node = root;for (char c : prefix.toCharArray()) {if (!node.getChild(c)) {return false;}node = node.getChild(c);}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}
}
相关文章:
Java手写Trie树和Trie树应用拓展案例
Java手写Trie树和Trie树应用拓展案例 1. 算法思维导图 以下是使用mermaid代码表示的Trie树的实现原理: #mermaid-svg-5twy24X7Wqbhyulb {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-5twy24X7Wqbhyul…...

alova.js快速入门教程
官网地址:Alova.JS - Lightweight request strategy library | Alova.JS 目录 一、alova 是什么? 二、 快速入门 1、安装依赖 (1)使用npm方式安装 (2)使用yarn方式安装 2、在静态 html 中使用 一、al…...
获取IP地址-根据IP获取位置信息
获取外网IP地址,并得到该地址所在位置; 如:101.249.255.255 对应:西藏自治区-拉萨市-堆龙德庆区 string ipAddress GetIPAddress(); string location GetIPLocation(ipAddress); /// <summary>/// 获取IP地址/// </s…...

Android13适配-Google官方照片视频选择器
官方照片选择器 图 1. 照片选择器提供了一个直观的界面,便于与您的应用分享照片。 照片选择器的界面可供浏览和搜索,并按日期降序向用户显示其媒体库中的文件。如隐私保护最佳实践 Codelab 中所示,照片选择器为用户提供了一种安全的内置授权…...
云计算的发展趋势和挑战
本文将探讨云计算的发展趋势和挑战,旨在帮助读者了解云计算的最新动态和未来发展方向。 随着信息技术的发展,云计算作为一种新兴的计算模式,已经得到了广泛的应用和认可。它通过将计算资源、存储资源和应用程序等服务通过互联网提供给用户&a…...

PyG-GAT-Cora(在Cora数据集上应用GAT做节点分类)
文章目录 model.pymain.py参数设置运行图 model.py import torch.nn as nn from torch_geometric.nn import GATConv import torch.nn.functional as F class gat_cls(nn.Module):def __init__(self,in_dim,hid_dim,out_dim,dropout_size0.5):super(gat_cls,self).__init__()s…...
java专项练习(验证码)
package 专题练习;import java.util.Random;public class Developing_CAPTCHA {public static void main(String[] args) {/* 需求:定义方法生成一个5位的验证码 验证码长度为5,前四位为大或小写字母,最后一位是数字*///方法: 如果我们要在一堆没有规律的数据中随机抽取,可以先…...

MS1861 视频处理与显示控制器 HDMI转MIPI LVDS转MIPI带旋转功能 图像带缩放,旋转,锐化
1. 基本介绍 MS1861 单颗芯片集成了 HDMI 、 LVDS 和数字视频信号输入;输出端可以驱动 MIPI(DSI-2) 、 LVDS 、 Mini-LVDS 以及 TTL 类型 TFT-LCD 液晶显示。可支持对输入视频信号进行滤波,图 像增强,锐化,对比度调节&am…...

广州华锐互动:利用VR复原文化遗址,沉浸式体验历史文物古迹的魅力
在过去的几十年里,科技发展飞速,为我们打开了无数新的视角和可能性。其中,虚拟现实(Virtual Reality,简称VR)技术的崭新应用,为我们提供了一种全新的、近乎身临其境的体验历史的方式。本文将重点…...
微信小程序——事件监听
微信小程序是一种轻量级的应用程序,它在移动设备上提供了丰富的用户体验。在开发微信小程序时,事件监听是一项重要的技术,它允许开发者捕捉和处理用户的各种操作。本文将介绍微信小程序事件监听的概念、用法和一些实用示例。 1. 什么是事件监…...
View绘制流程的源码所得
一些问题 子线程可以更新 UI 吗 答案是可以的,在特定的情况下可以 可以先在主线程中调用requestLayout() 方法,然后紧接着在子线程中更新UI(原理:不要在子线程触发 checkThread() 方法,而checkThread() 方法的调用时…...

企业级数据仓库-理论知识
D3 AM 大数据中间件 Hive:将SQL转化成分布式Map/Reduce进行运算,也支持转换成Spark,需要单独安装Hive集群才能访问Spark,支持60%的SQL,延迟比较大。SparkSQL:属于Spark生态圈,Hive on Sqark。HBase: NoSQL,高并发读,适…...

解决flutter不识别yaml里面配置的git项目
解决办法找到相应的 git路径,然后手动 git pull 暂时先用这个笨方法,后面有更好的解决办法了再说 studio 自己拉取的项目里面没有ios 和lib包...
rust结构体
一、定义结构体类型 语法 struct Name_of_structure {field1: data_type,field2: data_type,field3: data_type, }注意: 不同于C,Rust的struct语句仅用来定义类型,不能定义实例。 结尾不需要;。 每个字段定义之后用 , 分隔。最后一个逗号可…...

Python - 小玩意 - 键盘记录器
pip install keyboardimport keyboard import timedef get_time():date_time time.strftime("%Y-%m-%d %H:%S", time.localtime())return date_timedef abc(x):if x.event_type down:print(f"{get_time()}你按下了{x.name}")with open(./键盘记录器.txt,…...

msvcp71.dll丢失的解决方法分享,全面分析msvcp71.dll丢失原因
msvcp71.dll 丢失的问题可能困扰着许多使用 Windows 操作系统的用户。msvcp71.dll 是微软 C运行时库中的一个动态链接库文件,负责提供一些基本的函数和类,例如字符串处理、数学运算、文件操作等。如果这个文件丢失或损坏了,那么在使用依赖于它…...

stm32----ADC模数转换
一、ADC介绍 ADC,即模数转换器,它可以将模拟信号转化为数字信号。在stm32种一般有3个ADC,每个ADC有18个通道。 12位ADC是一种逐次逼近型模拟数字转换器,它有多达18个通道,可测量16个外部和两个内部信号源。各个通道的A…...

Unity SteamVR 开发教程:用摇杆/触摸板控制人物持续移动(2.x 以上版本)
文章目录 📕教程说明📕场景搭建📕创建移动的动作📕移动脚本⭐移动⭐实时调整 CharacterController 的高度 📕取消手部和 CharacterController 的碰撞 持续移动是 VR 开发中的一个常用功能。一般是用户推动手柄摇杆&…...

04条件构造器和常用接口
条件构造器和常用接口 wapper介绍 条件构造器的两个条件之间默认就是AND并列关系,如果需要或者的关系则需要调用构造器的or()方法 条件构造器类型作用Wrapper条件构造抽象类,最顶端父类AbstractWrapper生成SQL的where条件QueryWrapper封装查询或删除的条件UpdateWrapper封装修…...

什么是HTTP状态码?常见的HTTP状态码有哪些?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 什么是HTTP状态码?⭐ 1xx - 信息性状态码⭐ 2xx - 成功状态码⭐ 3xx - 重定向状态码⭐ 4xx - 客户端错误状态码⭐ 5xx - 服务器错误状态码⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...

深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...