当前位置: 首页 > 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开发的奇妙世界 欢迎来到前…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...