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

Java手写Trie树和Trie树应用拓展案例

Java手写Trie树和Trie树应用拓展案例

1. 算法思维导图

以下是使用mermaid代码表示的Trie树的实现原理:

Root
Node 1
Node 2
Node 3
Node 4
Node 5
Node 6
Node 7
Node 8
Node 9
Node 10
Node 11
Node 12
Node 13
Node 14
Node 15
Node 16
Node 17
Node 18
Node 19
Node 20
Node 21
Node 22
Node 23
Node 24
Node 25

Trie树,也称为字典树或前缀树,是一种用于高效存储和搜索字符串集合的数据结构。它的核心思想是利用字符串的公共前缀来节省存储空间和搜索时间。

Trie树的基本结构是一个树形结构,其中每个节点表示一个字符。根节点为空字符,每个节点的子节点表示下一个字符。通过从根节点到叶子节点的路径,可以得到一个完整的字符串。

Trie树的特点如下:

  1. 每个节点都包含一个字符和一个标记,标记表示以该节点为结尾的字符串是否存在。
  2. 从根节点到任意节点的路径表示一个字符串。
  3. 每个节点的子节点是按照字符的顺序排列的,即子节点的字符是有序的。
  4. 任意节点的子节点可能为空,表示该节点没有对应的字符。

Trie树的主要操作包括插入、搜索和前缀搜索:

  1. 插入操作:从根节点开始,依次将字符串的每个字符插入到Trie树中。如果某个字符在当前节点的子节点中不存在,则创建一个新的节点,并将其加入到当前节点的子节点中。最后将插入的字符串的最后一个字符节点标记为结束节点。
  2. 搜索操作:从根节点开始,依次遍历字符串的每个字符。如果某个字符在当前节点的子节点中不存在,则说明字符串不存在于Trie树中。如果遍历完字符串后,当前节点的结束节点标记为true,则说明字符串存在于Trie树中。
  3. 前缀搜索操作:从根节点开始,依次遍历字符串的每个字符。如果某个字符在当前节点的子节点中不存在,则说明不存在以该字符串为前缀的字符串。如果遍历完字符串后,当前节点存在子节点,则说明存在以该字符串为前缀的字符串。

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树的实现步骤:

  1. 创建Trie树的节点类TrieNode,包含一个字符和一个布尔变量表示是否是字符串的结束字符,以及一个哈希表用于存储子节点。
  2. 创建Trie树的类Trie,包含一个根节点。
  3. 实现Trie类的insert方法,用于插入一个字符串到Trie树中。
    • 从根节点开始,依次遍历字符串的每个字符。
    • 如果当前字符不存在于当前节点的子节点中,则创建一个新的节点,并将其加入到当前节点的子节点中。
    • 将当前节点指向新创建的节点。
    • 如果遍历完字符串后,将当前节点的结束字符标记为true。
  4. 实现Trie类的search方法,用于搜索一个字符串是否存在于Trie树中。
    • 从根节点开始,依次遍历字符串的每个字符。
    • 如果当前字符不存在于当前节点的子节点中,则返回false。
    • 将当前节点指向下一个字符对应的子节点。
    • 如果遍历完字符串后,返回当前节点的结束字符标记。
  5. 实现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树的实现原理&#xff1a; #mermaid-svg-5twy24X7Wqbhyulb {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-5twy24X7Wqbhyul…...

alova.js快速入门教程

官网地址&#xff1a;Alova.JS - Lightweight request strategy library | Alova.JS 目录 一、alova 是什么&#xff1f; 二、 快速入门 1、安装依赖 &#xff08;1&#xff09;使用npm方式安装 &#xff08;2&#xff09;使用yarn方式安装 2、在静态 html 中使用 一、al…...

获取IP地址-根据IP获取位置信息

获取外网IP地址&#xff0c;并得到该地址所在位置&#xff1b; 如&#xff1a;101.249.255.255 对应&#xff1a;西藏自治区-拉萨市-堆龙德庆区 string ipAddress GetIPAddress(); string location GetIPLocation(ipAddress); /// <summary>/// 获取IP地址/// </s…...

Android13适配-Google官方照片视频选择器

官方照片选择器 图 1. 照片选择器提供了一个直观的界面&#xff0c;便于与您的应用分享照片。 照片选择器的界面可供浏览和搜索&#xff0c;并按日期降序向用户显示其媒体库中的文件。如隐私保护最佳实践 Codelab 中所示&#xff0c;照片选择器为用户提供了一种安全的内置授权…...

云计算的发展趋势和挑战

本文将探讨云计算的发展趋势和挑战&#xff0c;旨在帮助读者了解云计算的最新动态和未来发展方向。 随着信息技术的发展&#xff0c;云计算作为一种新兴的计算模式&#xff0c;已经得到了广泛的应用和认可。它通过将计算资源、存储资源和应用程序等服务通过互联网提供给用户&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 和数字视频信号输入&#xff1b;输出端可以驱动 MIPI(DSI-2) 、 LVDS 、 Mini-LVDS 以及 TTL 类型 TFT-LCD 液晶显示。可支持对输入视频信号进行滤波&#xff0c;图 像增强&#xff0c;锐化&#xff0c;对比度调节&am…...

广州华锐互动:利用VR复原文化遗址,沉浸式体验历史文物古迹的魅力

在过去的几十年里&#xff0c;科技发展飞速&#xff0c;为我们打开了无数新的视角和可能性。其中&#xff0c;虚拟现实&#xff08;Virtual Reality&#xff0c;简称VR&#xff09;技术的崭新应用&#xff0c;为我们提供了一种全新的、近乎身临其境的体验历史的方式。本文将重点…...

微信小程序——事件监听

微信小程序是一种轻量级的应用程序&#xff0c;它在移动设备上提供了丰富的用户体验。在开发微信小程序时&#xff0c;事件监听是一项重要的技术&#xff0c;它允许开发者捕捉和处理用户的各种操作。本文将介绍微信小程序事件监听的概念、用法和一些实用示例。 1. 什么是事件监…...

View绘制流程的源码所得

一些问题 子线程可以更新 UI 吗 答案是可以的&#xff0c;在特定的情况下可以 可以先在主线程中调用requestLayout() 方法&#xff0c;然后紧接着在子线程中更新UI&#xff08;原理&#xff1a;不要在子线程触发 checkThread() 方法&#xff0c;而checkThread() 方法的调用时…...

企业级数据仓库-理论知识

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

解决flutter不识别yaml里面配置的git项目

解决办法找到相应的 git路径&#xff0c;然后手动 git pull 暂时先用这个笨方法&#xff0c;后面有更好的解决办法了再说 studio 自己拉取的项目里面没有ios 和lib包...

rust结构体

一、定义结构体类型 语法 struct Name_of_structure {field1: data_type,field2: data_type,field3: data_type, }注意&#xff1a; 不同于C&#xff0c;Rust的struct语句仅用来定义类型&#xff0c;不能定义实例。 结尾不需要;。 每个字段定义之后用 , 分隔。最后一个逗号可…...

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运行时库中的一个动态链接库文件&#xff0c;负责提供一些基本的函数和类&#xff0c;例如字符串处理、数学运算、文件操作等。如果这个文件丢失或损坏了&#xff0c;那么在使用依赖于它…...

stm32----ADC模数转换

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

Unity SteamVR 开发教程:用摇杆/触摸板控制人物持续移动(2.x 以上版本)

文章目录 &#x1f4d5;教程说明&#x1f4d5;场景搭建&#x1f4d5;创建移动的动作&#x1f4d5;移动脚本⭐移动⭐实时调整 CharacterController 的高度 &#x1f4d5;取消手部和 CharacterController 的碰撞 持续移动是 VR 开发中的一个常用功能。一般是用户推动手柄摇杆&…...

04条件构造器和常用接口

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

什么是HTTP状态码?常见的HTTP状态码有哪些?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 什么是HTTP状态码&#xff1f;⭐ 1xx - 信息性状态码⭐ 2xx - 成功状态码⭐ 3xx - 重定向状态码⭐ 4xx - 客户端错误状态码⭐ 5xx - 服务器错误状态码⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...