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开发的奇妙世界 欢迎来到前…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...

无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...