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

简单了解前缀树/字典树(Trie树)C++代码

介绍Trie树

Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补全和拼写检查。

前缀树也有一些其它的名称:字典树,前缀树,单词查找树等。

Trie树是一颗非典型的多叉树模型。

一般的多叉树,它们的结点通常主要包含了:

1.该结点的值

2.它的下一个孩子的指针

假设我们要查找的字符的范围是 [a,z],也就是26的大小,

那么每一个前缀树的结点主要就包含以下两个值:

bool isEnd;
Trie* next[26];

第一个是一个bool值,它用来表示这个字符串是否到了结尾。

第二个值就是一个前缀树结点的指针的数组,它的大小刚好是26,那么这个结点的下一个孩子的指针数组下标就可以表示一个字符,而却并没有直接保存字符,这就是Trie树的巧妙之处。

比如,用如下的示意图可以表示字符串 aa aba :

其它空指针就没有画出来了。并且它也可以表示字符串a ab,只要在对应的结点将isEnd改为true,表示它是一个字符串的末尾即可。 

 

Trie树的简单实现

在力扣上有一道题:

 

这道题的大致意思就是让我们实现一个简单的前缀树,这个前缀树可以进行插入,查找,以及判断一个字符串是否是某个字符串的前缀。

代码:

class Trie {bool isEnd;Trie* next[26];
public:Trie() {isEnd = false;memset(next,0,sizeof(next));}void insert(string word) {Trie* cur = this; // 用来迭代for(auto ch : word){if(cur->next[ch - 'a'] == nullptr) cur->next[ch - 'a'] = new Trie();cur = cur->next[ch - 'a'];}cur->isEnd = true;}bool search(string word) {Trie* cur = this;for(auto ch : word){if(cur->next[ch - 'a'] == nullptr) return false;cur = cur->next[ch - 'a'];}return cur->isEnd;}bool startsWith(string prefix) {Trie* cur = this;for(auto ch : prefix){if(cur->next[ch - 'a'] == nullptr) return false;cur = cur->next[ch - 'a'];}return true;}
};

 这里的实现其实将结点和函数的实现放在一起了,也可以将结点在类外面进行封装。

Trie树小总结: 

Trie 的形状和单词的插入或删除顺序无关,也就是说对于任意给定的一组单词,Trie 的形状都是唯一的。

查找或插入一个长度为 L 的单词,访问 next 数组的次数最多为 L+1,和 Trie 中包含多少个单词无关。

Trie 的每个结点中都保留着一个字母表,这是很耗费空间的。如果 Trie 的高度为 n,字母表的大小为 m,最坏的情况是 Trie 中还不存在前缀相同的单词,那空间复杂度就为 O(m * n)。

 关于Trie树的应用场景:一次建树,多次查询

http://www.lryc.cn/news/475196.html

相关文章:

  • ubuntu安装与配置Nginx(2)
  • Linux环境下Mongodb部署
  • (九)JavaWeb后端开发——Servlet
  • 【零售和消费品&家居用品】家庭门窗开闭状态安全监控系统源码&数据集全套:改进yolo11-DCNV2
  • 【JavaScript】axios 二次封装拦截器(接口、实例、全局)
  • Linux_02 Linux常用软件——vi、vim
  • C++代码优化--要求或禁止在堆中产生对象
  • MybatisPlus入门(六)MybatisPlus-空值处理
  • 钉钉内集成第三方免密登录(Vue+.Net)
  • 卷积神经网络实验三:模型优化(1)
  • STM32F103的CAN通讯接收测试
  • 【Rust中的智能指针】
  • 基于深度学习的社交网络中的社区检测
  • 【Python基础】
  • 【玉米叶部病害识别】Python+深度学习+人工智能+图像识别+CNN卷积神经网络算法+TensorFlow
  • 【设计模式】如何用C++实现依赖倒置
  • 使用onnxruntime-web 运行yolov8-nano推理
  • Gin框架html/vue前端使用hls.js播放/点播m3u8(hls)格式视频
  • HarmonyOS 私仓搭建
  • Mybatis学习笔记(二)
  • Google“Big Sleep“人工智能项目发现真实软件漏洞
  • npm入门教程5:package.json
  • docker-高级(待补图)
  • Qt 文件目录操作
  • Pandas 数据清洗
  • IO学习笔记
  • 汇编练习-1
  • 初识二叉树( 二)
  • AcWing1077-cnblog
  • 五、SpringBoot3实战(1)