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

字典树介绍以及C++实现

字典树的概念

字典树(Trie),又称为前缀树或单词查找树,是一种树形数据结构,主要用于存储具有相同前缀的字符串集合。它特别适合用于词典中的单词查找、自动补全、拼写检查等应用。
在这里插入图片描述
字典树算法的核心思想就是每层存入单词的字符,顺着树节点依次往下排布,用bool judge变量来标记此字符处是否构成单词(某个单词的结尾字符),还可以用一个int counter变量来累计某个前缀出现的次数。

字典树的特点:

  1. 根节点不包含字符,通常为空。
  2. 每个节点表示一个字符串中的字符
  3. 从根节点到某一节点的路径表示一个字符串
  4. 每个节点的所有子节点包含的字符都不相同

字典树的操作:

  • 插入操作:将一个字符串逐字符插入字典树。对于每个字符,从根节点开始,检查是否存在对应的子节点。如果不存在,则创建一个新的节点。
  • 查找操作:检查一个字符串是否在字典树中。类似于插入操作,逐字符检查是否存在对应的节点。
  • 删除操作:从字典树中删除一个字符串。需要小心处理节点的删除,以确保不影响其他字符串的存储。

字典树的优点:

  • 快速查找:查找的时间复杂度为O(m),其中m为待查找字符串的长度。
  • 节省空间:通过共享相同前缀的方式,节省了存储空间。

字典树的缺点:

  • 空间消耗大:在最坏的情况下,字典树可能需要大量的节点和指针。
  • 实现复杂性:相对于哈希表,字典树的实现相对复杂。

字典树在很多应用中表现出色,尤其是在需要处理大量字符串并进行快速查找的场景中。

C++代码实现字典树

在C++中实现字典树(Trie)通常包括以下几个步骤:

  1. 定义 TrieNode 类:每个节点包含若干子节点和一些必要的信息,比如标记是否是某个单词的结尾。
  2. 定义 Trie 类:主要提供插入、查找和删除等功能。

下面是一个简单的字典树(Trie)的C++实现:

1. 定义 TrieNode

#include <iostream>
#include <unordered_map>using namespace std;// TrieNode 节点结构
class TrieNode {
public:unordered_map<char, TrieNode*> children; // 子节点映射bool isEndOfWord;  // 是否是一个单词的结尾TrieNode() : isEndOfWord(false) {}
};

2. 定义 Trie

class Trie {
private:TrieNode* root;  // 根节点public:// 构造函数Trie() {root = new TrieNode();}// 插入一个单词到字典树void insert(const string& word) {currentNode = root;for (char c : word) {if (currentNode->children.find(c) == currentNode->children.end()) {currentNode->children[c] = new TrieNode();}currentNode = currentNode->children[c];}currentNode->isEndOfWord = true;  // 标记单词的结尾}// 查找一个单词是否存在于字典树中bool search(const string& word) {TrieNode* currentNode = root;for (char c : word) {if (currentNode->children.find(c) == currentNode->children.end()) {return false;  // 如果有任何字符找不到,返回 false}currentNode = currentNode->children[c];}return currentNode->isEndOfWord;  // 返回当前节点是否是单词的结尾}// 查找是否有任何单词以给定的前缀开始bool startsWith(const string& prefix) {TrieNode* currentNode = root;for (char c : prefix) {if (currentNode->children.find(c) == currentNode->children.end()) {return false;  // 如果前缀中的某个字符找不到,返回 false}currentNode = currentNode->children[c];}return true;  // 如果前缀存在,返回 true}
};

3. 使用字典树

int main() {Trie trie;// 插入单词trie.insert("apple");trie.insert("app");trie.insert("banana");// 查找单词cout << "search(\"apple\"): " << trie.search("apple") << endl;   // 输出 1 (true)cout << "search(\"app\"): " << trie.search("app") << endl;       // 输出 1 (true)cout << "search(\"banana\"): " << trie.search("banana") << endl; // 输出 1 (true)cout << "search(\"bat\"): " << trie.search("bat") << endl;       // 输出 0 (false)// 查找前缀cout << "startsWith(\"app\"): " << trie.startsWith("app") << endl;  // 输出 1 (true)cout << "startsWith(\"ban\"): " << trie.startsWith("ban") << endl;  // 输出 1 (true)cout << "startsWith(\"bana\"): " << trie.startsWith("bana") << endl;  // 输出 1 (true)cout << "startsWith(\"cat\"): " << trie.startsWith("cat") << endl;  // 输出 0 (false)return 0;
}

4. 代码解析

  • TrieNode 类

    • 使用 unordered_map 存储子节点映射,unordered_map 是 C++ 中一个哈希表实现,用来存储每个字符对应的子节点。
    • isEndOfWord 用来标记当前节点是否是某个单词的结尾。
  • Trie 类

    • insert:通过遍历单词的每个字符,将它们插入到字典树中。如果字符不存在,就创建新的节点。最后标记该节点为单词的结尾。
    • search:查找一个单词是否在字典树中。如果路径上的任何字符不存在,直接返回 false。最终检查最后一个节点是否是单词的结尾。
    • startsWith:查找是否有任何单词以给定前缀开始。只要能够找到前缀的所有字符,就返回 true

5. 输出示例:

search("apple"): 1
search("app"): 1
search("banana"): 1
search("bat"): 0
startsWith("app"): 1
startsWith("ban"): 1
startsWith("bana"): 1
startsWith("cat"): 0

6. 优化

  • 字典树的空间复杂度较高,特别是当字典中的单词较多时。为了节省空间,可以使用更紧凑的结构,如 压缩字典树(Radix Tree),或者使用 字符数组 替代 unordered_map,减少指针的开销。

总结

这个 C++ 实现展示了一个基本的字典树(Trie)数据结构,支持插入、查找和前缀查找等操作。它适用于需要高效查找大量字符串的场景,比如自动补全、词典查询等。

相关文章:

字典树介绍以及C++实现

字典树的概念 字典树&#xff08;Trie&#xff09;&#xff0c;又称为前缀树或单词查找树&#xff0c;是一种树形数据结构&#xff0c;主要用于存储具有相同前缀的字符串集合。它特别适合用于词典中的单词查找、自动补全、拼写检查等应用。 字典树算法的核心思想就是每层存入…...

【C++】用红黑树封装set和map

在C标准库中&#xff0c;set容器和map容器的底层都是红黑树&#xff0c;它们的各种接口都是基于红黑树来实现的&#xff0c;我们在这篇文章中已经模拟实现了红黑树 ->【C】红黑树&#xff0c;接下来我们在此红黑树的基础上来看看如何封装set和map。 一、共用一颗红黑树 我…...

【大数据测试HDFS + Flask详细教程与实例】

大数据测试HDFS Flask 1. 环境准备安装工具安装Hadoop&#xff08;以单机模式为例&#xff09;安装Flask和HDFS Python客户端 2. HDFS Flask基本架构基本文件结构 3. 创建Flask应用与与HDFS交互步骤1&#xff1a;配置HDFS连接步骤2&#xff1a;构建Flask应用 4. 创建前端界面…...

高级java每日一道面试题-2024年10月31日-RabbitMQ篇-RabbitMQ中vhost的作用是什么?

如果有遗漏,评论区告诉我进行补充 面试官: RabbitMQ中vhost的作用是什么? 我回答: 在Java高级面试中&#xff0c;关于RabbitMQ中vhost&#xff08;虚拟主机&#xff09;的作用是一个重要且常见的考点。以下是对vhost的详细解释&#xff1a; 一、vhost的基本概念 vhost&am…...

【日常记录-Java】代码配置Logback

1. 简介 在Logback中&#xff0c;推荐使用配置文件&#xff08;如logback.xml或logback-spring.xml&#xff09;来设置日志记录的行为。但在实际应用中&#xff0c;会有动态配置logback的需求。此时可通过编程的方式直接操作LoggerContext以及相关的Logger、Appender、Encoder等…...

HTTP常见的请求头有哪些?都有什么作用?在 Web 应用中使用这些请求头?

HTTP 请求头&#xff08;Request Headers&#xff09;用于在 HTTP 请求中携带额外的信息&#xff0c;帮助服务器更好地处理请求。以下是一些常见的 HTTP 请求头及其作用&#xff1a; 常见请求头及其作用 1. Accept 作用&#xff1a;告知服务器客户端可以接受的内容类型。示例…...

电信数据清洗案例:利用MapReduce实现高效数据预处理

电信数据清洗案例&#xff1a;利用MapReduce实现高效数据预处理 在大数据时代&#xff0c;电信行业积累了大量的用户通话、短信、上网等行为数据。在数据分析和机器学习模型训练前&#xff0c;对这些数据进行清洗是至关重要的一步。MapReduce 是一种高效的数据处理模型&#x…...

react 中 FC 模块作用

React.FC 是一个泛型类型&#xff0c;用于定义函数组件的类型 一、类型定义和代码可读性 1. 明确组件类型 使用React.FC定义一个组件时&#xff0c;使得组件的输入&#xff08;props&#xff09;和输出&#xff08;返回的 React 元素&#xff09;都有明确的类型定义。 impo…...

多模态大模型(1)--CLIP

CLIP&#xff08;Contrastive Language-Image Pre-training&#xff09;模型是一种多模态预训练神经网络&#xff0c;由OpenAI在2021年发布。它通过对比学习的方式&#xff0c;将图像和文本映射到同一个向量空间中&#xff0c;从而实现跨模态的检索和分类。下面介绍其基础功能&…...

opencv入门学习总结

opencv学习总结 不多bb&#xff0c;直接上代码&#xff01;&#xff01;&#xff01; 案例一&#xff1a; import cv2 # 返回当前安装的 OpenCV 库的版本信息 并且是字符串格式 print(cv2.getVersionString()) """ 作用&#xff1a;它可以读取不同格式的图像文…...

C/C++内存管理 | new的机制 | 重载自己的operator new

一、C/C内存分布 1. 内存分区 栈又叫堆栈–非静态局部变量/函数参数/返回值等等&#xff0c;栈是向下增长的。内存映射段是高效的I/O映射方式&#xff0c;用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存&#xff0c;做进程间通信 .堆用于程序运行时动态内…...

知识库管理系统:企业数字化转型的加速器

在数字化转型的大潮中&#xff0c;知识库管理系统&#xff08;KBMS&#xff09;已成为企业提升效率和创新能力的关键工具。本文将探讨知识库管理系统的定义、企业建立知识库的必要性&#xff0c;以及如何快速搭建企业知识库。 知识库管理系统是什么&#xff1f; 知识库管理系统…...

uniapp 如何使用vuex store (亲测)

首先是安装&#xff1a; npm install vuexnext --save 安装之后&#xff0c;Vue2 这样写 不管在哪里&#xff0c;建立一个JS文件&#xff0c;假设命名&#xff1a;store.js 代码这样写&#xff1a; import Vue from vue; import Vuex from vuex;Vue.use(Vuex);const store…...

[编译报错]ImportError: No module named _sqlite3解决办法

1. 问题描述&#xff1a; 在使用python进行代码编译时&#xff0c;提示下面报错&#xff1a; "/home/bspuser/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py", line 18, in <module>import sqlite3File "/usr/local/lib/python2.7/sqlite3/_…...

【旷视科技-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…...

python学习记录16

字符串总结 python程序使用unicode编码&#xff0c;中文字符与英文字符都占一个字符&#xff0c;但英文字符只占一个字节&#xff0c;中文字符若按照utf-8格式编码占3个字节。 &#xff08;1&#xff09;字符串常用方法 1&#xff09;大小写转化 string.upper()#将所有字母…...

AI 大模型在软件开发中的角色

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/402a907e12694df5a34f8f266385f3d2.png#pic_center> &#x1f393;作者简介&#xff1a;全栈领域优质创作者 &#x1f310;个人主页&#xff1a;百锦再新空间代码工作室 &#x1f4de;工作室&#xff1a;新空间代…...

React中类组件和函数组件的理解和区别

react代码模块分为类组件和函数组件。 从语法和定义、内部状态管理、生命周期、性能、可读性和维护性、上下文、集成状态管理库等角度对比React中类组件和函数组件。 1、语法和定义 类组件&#xff1a; 使用 ES6 的类&#xff08;class&#xff09;语法定义的 React 组件。…...

Day62||prim算法精讲 |kruskal算法精讲

prim算法精讲 53. 寻宝&#xff08;第七期模拟笔试&#xff09; 题目描述 在世界的某个区域&#xff0c;有一些分散的神秘岛屿&#xff0c;每个岛屿上都有一种珍稀的资源或者宝藏。国王打算在这些岛屿上建公路&#xff0c;方便运输。 不同岛屿之间&#xff0c;路途距离不同&…...

upload-labs通关练习

目录 环境搭建 第一关 第二关 第三关 第四关 第五关 第六关 第七关 第八关 第九关 第十关 第十一关 第十二关 第十三关 第十四关 第十五关 第十六关 第十七关 第十八关 第十九关 第二十关 总结 环境搭建 upload-labs是一个使用php语言编写的&#xff0c…...

GitHub Copilot X:从代码补全到全流程AI协作者的实战指南

1. 项目概述&#xff1a;当代码编辑器遇见“副驾驶”如果你和我一样&#xff0c;每天有超过一半的时间是在代码编辑器里度过的&#xff0c;那你一定对“效率”这个词有着近乎偏执的追求。从语法高亮、代码补全&#xff0c;到后来的LSP&#xff08;Language Server Protocol&…...

P6 马铃薯病害识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 个人总结&#xff1a;了解VGG由 5 组卷积池化块堆叠构成&#xff0c;依靠小尺寸卷积核逐层提取图像浅层、深层特征&#xff0c;最后通过全连接层完成分类。&…...

代码优化的10个技巧:让你的代码既高效又优雅

对于软件测试从业者而言&#xff0c;编写高质量的测试代码是保障测试效率、提升测试可靠性的核心基础。无论是自动化测试脚本、测试工具开发还是测试框架搭建&#xff0c;臃肿、低效、可读性差的代码不仅会拖慢测试执行速度&#xff0c;还会增加缺陷排查的难度&#xff0c;提升…...

强化学习实战指南:从原理到工业落地的完整路径

1. 这不是科幻&#xff0c;是正在发生的现实&#xff1a;当机器在围棋、电竞、物流调度甚至蛋白质折叠中全面超越人类你有没有过这种感觉&#xff1a;刷到一条新闻说“AI又赢了人类冠军”&#xff0c;第一反应不是惊讶&#xff0c;而是点开前先猜——这次输的是围棋手、星际争霸…...

Donut端到端票据识别:小票图像直出结构化JSON

1. 项目概述&#xff1a;一张小票&#xff0c;如何让AI“看懂”并结构化输出&#xff1f;你有没有试过把超市小票拍张照&#xff0c;想让手机自动提取“总金额&#xff1a;89.50”“商品&#xff1a;牛奶2”“时间&#xff1a;2024-03-12 18:23”这些信息&#xff1f;不是OCR识…...

去水印工具免费版哪个好用?2026免费去水印工具对比与选择指南

在日常工作和创意制作中&#xff0c;我们经常需要处理带有水印的图片和视频。无论是为了素材库积累、内容二次创作&#xff0c;还是个人学习参考&#xff0c;选择一款合适的去水印工具至关重要。市面上众多免费去水印工具各具特色&#xff0c;有的专注速度&#xff0c;有的擅长…...

3小时变3分钟:用ChanlunX插件让通达信自动绘制缠论结构

3小时变3分钟&#xff1a;用ChanlunX插件让通达信自动绘制缠论结构 【免费下载链接】ChanlunX 缠中说禅炒股缠论可视化插件 项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX 你是否曾经面对复杂的K线图&#xff0c;试图手工画出缠论中的笔、线段和中枢&#xff0…...

写给前端的 CANN-ops-rand:昇腾随机数生成算子库到底是啥?

之前做强化学习&#xff0c;兄弟问我&#xff1a;“哥&#xff0c;我想在昇腾上做蒙特卡洛模拟&#xff0c;随机数生成有现成的库吗&#xff1f;” 好问题。今天一次说清楚。 ops-rand 是啥&#xff1f; ops-rand Operations for Random&#xff0c;昇腾随机数生成算子库。 一…...

MCP模型控制平面:AI自动化系统的可观察、可治理底座

1. 项目概述&#xff1a;MCP到底是什么&#xff0c;它凭什么被称为AI自动化的“金钥匙”“MCP——The Golden Key for AI Automation”这个标题一出来&#xff0c;很多刚接触AI工程化的朋友第一反应是&#xff1a;又一个新造词&#xff1f;听着像营销话术。但我在过去三年里&am…...

技术人被裁员时,除了N+1还有哪些权益可以争取?

一、 核心概念澄清&#xff1a;你的赔偿基准是 N、N1 还是 2N&#xff1f;在挖掘附加权益之前&#xff0c;我们必须像制定测试策略一样&#xff0c;先明确基准。很多测试同学对赔偿的理解存在“Bug”&#xff0c;必须优先修复。N&#xff1a;指经济补偿金&#xff0c;计算方式是…...