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开发的奇妙世界 欢迎来到前…...
突破Windows苹果设备连接限制:Apple-Mobile-Drivers-Installer的自动化驱动解决方案
突破Windows苹果设备连接限制:Apple-Mobile-Drivers-Installer的自动化驱动解决方案 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址…...
SDMatte+边缘精修效果展示:羽毛建模精度、纱布透光过渡、叶片脉络保留
SDMatte边缘精修效果展示:羽毛建模精度、纱布透光过渡、叶片脉络保留 1. 惊艳效果开场 想象一下这样的场景:你需要为一件羽毛饰品拍摄产品图,但无论怎么调整灯光和背景,羽毛边缘总是显得模糊不清;或者当你尝试抠出一…...
开源视觉模型推荐:GLM-4v-9B,高分辨率输入,中文OCR领先
开源视觉模型推荐:GLM-4v-9B,高分辨率输入,中文OCR领先 1. 引言 在当今多模态AI快速发展的时代,视觉-语言模型正成为技术前沿的热点。GLM-4v-9B作为智谱AI最新开源的90亿参数视觉-语言多模态模型,凭借其11201120高分…...
新手必看!用Simulink搭建ANPC三电平逆变器的SPWM仿真模型(附完整模型文件)
从零构建ANPC三电平逆变器的SPWM仿真模型:Simulink实战指南 在电力电子领域,多电平逆变器因其优异的输出波形质量和较低的开关损耗而备受关注。其中,有源中点箝位型(ANPC)三电平逆变器凭借其独特的拓扑结构和控制灵活性…...
Wan2.2-I2V-A14B性能调优:基于算法原理的模型推理加速策略
Wan2.2-I2V-A14B性能调优:基于算法原理的模型推理加速策略 1. 效果亮点预览 在RTX4090D显卡上,经过系统调优的Wan2.2-I2V-A14B模型展现出惊人的性能提升:单次推理耗时从原始的38ms降低至22ms,吞吐量提升近72%。更令人惊喜的是&a…...
十大经典排序算法解析与实现
## 1. 十大经典排序算法技术解析### 1.1 算法分类体系 排序算法可分为两大技术类别:**比较类排序**: - 通过元素间比较确定相对次序 - 时间复杂度下限为O(nlogn) - 典型代表:快速排序、堆排序、归并排序**非比较类排序**: - 不依赖…...
ADS 2025瞬态仿真实战:手把手教你搞定PCB微带线串扰分析(含变量单位避坑指南)
ADS 2025瞬态仿真实战:手把手教你搞定PCB微带线串扰分析(含变量单位避坑指南) 作为一名硬件工程师,在高速PCB设计中遇到串扰问题就像在迷宫里寻找出口——看似简单却处处暗藏陷阱。特别是当你在ADS 2025中按照教程一步步设置参数&…...
轻量级MCU命令行交互系统设计与优化
1. 轻量级MCU命令行交互系统设计指南1.1 系统概述在嵌入式系统开发过程中,调试和维护阶段往往需要与单片机进行参数交互和操作控制。传统解决方案如RT-Thread的finsh组件虽然功能强大,但对于资源受限的MCU(如ROM<64KB,RAM<8…...
HP-Socket创新项目原型迭代记录:变更、原因与效果
HP-Socket创新项目原型迭代记录:变更、原因与效果 【免费下载链接】HP-Socket High Performance TCP/UDP/HTTP Communication Component 项目地址: https://gitcode.com/gh_mirrors/hp/HP-Socket HP-Socket作为一款高性能TCP/UDP/HTTP通信组件,其…...
SecGPT-14B部署教程:模型热更新机制设计,不中断服务切换安全知识版本
SecGPT-14B部署教程:模型热更新机制设计,不中断服务切换安全知识版本 1. SecGPT-14B简介 SecGPT是由云起无垠推出的开源大语言模型,专门针对网络安全领域设计。这个模型融合了自然语言理解、代码生成和安全知识推理等核心能力,能…...
