字典树及其C++实现

C++ 字典树详解(含例题) C++ 字典树详解(含例题) 字典树的定义 顾名思义,就是一个像字典一样的树,谢谢观看 我们想要熟练的运用字典树,首先肯定要知道什么样的结构才会被称之为字典树吧。 字典树是一种树形结构,典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较———百度百科 从上面的百度百科的一段定义中,我们知道了字典树是:利用字符串的公共前缀来减少复杂度;用于统计,排序和保存大量字符串的数据结构 阅读详情

1、什么是Trie树(参考)

    Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。

字典树3个基本性质:

  • 根节点不包含字符,除根节点外每一个节点都只包含一个字符。
  • 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
  • 每个节点的所有子节点包含的字符都不相同。

假设有b,abc,abd,bcd,abcd,efg,hii 这6个单词,我们构建的树就是如下图这样的:

                             

    如上图所示,对于每一个节点,从根遍历到他的过程就是一个单词,如果这个节点被标记为红色,就表示这个单词存在,否则不存在。那么,对于一个单词,我只要顺着他从根走到对应的节点,再看这个节点是否被标记为红色就可以知道它是否出现过了。把这个节点标记为红色,就相当于插入了这个单词。这样一来我们查询和插入可以一起完成,所用时间仅仅为单词长度,在这一个样例,便是10。我们可以看到,trie树每一层的节点数是26^i级别的。所以为了节省空间。我们用动态链表,或者用数组来模拟动态。空间的花费,不会超过单词数×单词长度。

字典树的查询:

    使用trie时,因为当查询如字符串abc是否为某个字符串的前缀时,显然以b,c,d....等不是以a开头的字符串就不用查找了。所以建立trie的复杂度为O(n*len),而建立+查询在trie中是可以同时执行的,建立的过程也就可以成为查询的过程,hash就不能实现这个功能。所以总的复杂度为O(n*len),实际查询的复杂度也只是O(len)。(说白了,就是Trie树的平均高度h为len,所以Trie树的查询复杂度为O(h)=O(len))。

字典树优缺点:

优点:

  • 插入,查询,删除等操作复杂度为O(h),其中h为单词的长度。为什么会这么快呢,本质是空间换时间(空间复杂度为26的h次方),利用指针来避免做其他不必要的查找。(初始化的时间复杂度为 n*O(h),n为单词个数);
  • 当储存大量单词或者说储存的单词有着共同前缀时节省了空间。(比如说用线性存储boy,boyfriend如用trie存储的差别);

缺点:

  • 指针占用的空间,空间复杂度大。如果储存少量的单词,并不能节省空间。

字典树的应用:

  •  字符串检索:事先将已知的一些字符串(字典)的有关信息保存到trie树里,查找另外一些未知字符串是否出现过或者出现频率。
  • 字符串最长公共前缀(转化为寻找共同祖先问题)。

字典树和哈希表的比较(参考):

             

2、字典树的C++实现(参考)

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;

const int Num = 26;             //每个节点需要保存26个字母

struct TrieNode
{
    bool Isword;                //判断是否是单词
    TrieNode* next[Num];
    TrieNode() :Isword(false)   //初始化
    {
        memset(next, NULL, sizeof(next));
    }
};

class Trie
{
public:
    Trie() { root = new TrieNode(); }
    void insert(string word);
    bool search(string word);
    void deleteTrie(TrieNode* root);
private:
    TrieNode* root;
};

void Trie::insert(string word)
{
    TrieNode* location = root;
    for (int i = 0; i < word.length();i++)
    {
        if (location->next[word[i] - 'a'] == nullptr)
        {
            TrieNode* temp = new TrieNode();
            location->next[word[i] - 'a']=temp;
        }
        location = location->next[word[i] - 'a'];
    }
    location->Isword = true;
}

bool Trie::search(string word)
{
    TrieNode* location = root;
    //while (word&&location)//注意location不能为空
    for (int i = 0; i < word.length()&&location;i++)
        location = location->next[word[i] - 'a'];
    return(location != NULL && location->Isword);
}

void Trie::deleteTrie(TrieNode* root)
{
    for (int i = 0; i < Num; i++)
    {
        if (root->next[i] != NULL)
        {
            deleteTrie(root->next[i]);
        }
    }
    delete root;
}

void main()                     //简单测试  
{
    Trie tree;
    int n;                      //输入n个单词在字典树中
    cin >> n;
    while (n--)
    {
        string s;
        cin >> s;
        tree.insert(s);
    }
    string input;
    cout << "输入要检查的单词" << endl;
    cin >> input;
    cout << boolalpha << tree.search(input) << endl;//查找是否存在是个单词
}

 

Trie树(字典树)C++详解 字典树是一个用来快速查找和存储字符串集合的数据结构。 阅读详情

相关推荐

ue4 classuobject没有成员beginplay_【教程】UE4 C++实现简单的AI及遇到的坑

后续文章更新移步→微信公众号“虚幻社区”(mantra-xhsq),您的支持是我创作的动力。我们这篇文章的宗旨是用代码实现简单的AI,有多简单,只是搭建一个具有PawnSensing组件和回调的AI。重点也不是做一个AI,而是了解一下C++代码如何搭建最基本的AI(关于蓝图如何创建请自行百度)。如果英语还不错的话,可以移步 参考链接,链接中的内容除了创建基本的PawnSensing组件还有关于行为...

weixin_39929918的博客 1127

字典树(C++)

Trie树,即字典树,是一种哈希树的变种。是一种用于快速查询某个字符串/字符前缀是否存在的数据结构。它的优点是最大限度地减少无谓的字符串比较,查询效率比哈希表高。核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。...

赵铁蛋的博客 5915

基于FPGA的心电信号实时处理与智能诊断系统实现【附源码解析】

本文详细介绍了基于FPGA的心电信号实时处理与智能诊断系统的设计与实现。系统通过高精度采集电路和FPGA数字滤波技术处理微弱心电信号,采用自适应算法准确检测QRS波群,实现心率计算和心律异常诊断。附源码解析展示了FIR滤波器、中值滤波器和诊断逻辑的Verilog实现,为心电监护系统开发提供实用参考。

g8f9d0s1a2的博客 771

C++ 树进阶系列之深度剖析字典(trie)树

本文介绍了字典树的逻辑结构,并且使用链式和矩阵2种方案实现了字典的物理存储。并且通过2个具有代表性的案例让大家更深入理解字典树的实际应用。

y6123236的专栏 1922

D触发器版图设计的艺术:最小化面积与最大化性能的平衡之道

本文探讨了D触发器版图设计中如何平衡最小化面积与最大化性能的核心挑战。通过分析晶体管布局、互联优化、时钟分布等关键策略,结合先进制程下的功耗与信号完整性考量,为数字IC工程师提供了从基础优化到制造验证的实用解决方案,助力实现高性能、低面积的芯片设计。

aa123的博客 910

红外气体检测方案解析:从NDIR原理到物联网终端设计实践

气体检测是工业安全与环境监测的核心需求,其技术原理主要基于气体分子对特定物理或化学信号的响应。非色散红外(NDIR)技术作为一种物理检测方法,通过测量气体分子对特定波长红外光的吸收来定量浓度,因其不依赖化学反应,具备寿命长、抗干扰强和响应快等优势。在工程实践中,红外气体检测方案的价值在于为物联网终端设备提供了高可靠、低功耗的感知能力,广泛应用于工业过程监控、环境空气质量监测以及智能家居安全预警等场景。本文以一套集成了Microchip MCU、Axetris红外光源和Pyreos热释电传感器的参考设计为例,

weixin_30954817的博客 394

C++:【数据结构】trie树

这篇文章来介绍一个比较重要的数据结构:字典树(TrieTree)。其中 trie 一词来自于英语单词 retrieval 【检索】。

qq_73176808的博客 1053

基于Simulink的六旋翼无人机动力分配仿真建模示例

六旋翼无人机概述特点:高冗余度、增强的负载能力和更好的故障容忍性。关键组件电机与螺旋桨:提供升力和推力。电调(ESC):控制电机转速。IMU(惯性测量单元):包括加速度计和陀螺仪,用于姿态估计。飞控板:处理传感器数据并生成控制信号。应用场景:航拍摄影、农业监测、物流配送等。仿真目标搭建一个简化的六旋翼无人机动力分配模型,涵盖电机驱动、姿态控制及位置控制过程。分析不同条件下的性能指标(如响应时间、稳定性等),并探讨六旋翼无人机的设计优化。

xiaoheshang_123的博客 485

大厂面试必考——字典树(前缀树)及其C++实现

在大厂面试过程中,经常会考查到字典树的相关内容。那么字典树是什么?它通常用来解决什么问题?如何实现一个字典树?

csdnofhaner的博客 614

SpringBoot + MyBatis-Plus 高效实现数据变更记录:从注解到通用审计方案(附源码)

*** 数据变更审计插件* 拦截增删改操作,自动记录变更日志*/@Component@Resource/*** 拦截SQL执行*/@Override/*** 数据变更审计插件* 拦截增删改操作,自动记录变更日志/*** 拦截SQL执行。

2601_94871597的博客 559

数据资产可视化分析:PowerBI在大数据管理中的实战

目的:帮你搞懂“为什么数据资产需要可视化?”“PowerBI能帮企业解决什么问题?”,并掌握用PowerBI做大数据可视化的实战技巧。范围:覆盖数据资产定义、可视化分析原理、PowerBI核心功能(数据连接、建模、可视化)、零售企业实战案例,以及未来趋势与挑战。背景:为什么企业的数据像乱堆的玩具?核心概念:数据资产、可视化分析、PowerBI分别是什么?它们怎么配合?实战步骤:用PowerBI帮零售企业整理“销售玩具箱”,做出能指导决策的仪表盘;应用场景:不同部门怎么用这个“整理好的玩具箱”?

2501_92132293的博客 907

字典树

因为做题的需要,花了点时间学了字典树。原来字典树是那么的简单,我还以为很难呢。 在我看来,字典树就是为了方便查找。 从下面篇博客就能知道为什么在我看来字典树就是为了查找。 http://blog.youkuaiyun.com/u012501262/article/details/21695033 http://blog.youkuaiyun.com/u012501262/article/details/2

剑行earth 619

融合Retinex理论与Transformer的YOLOv8低光照目标检测增强方法【YOLOv8】

图像分解:将输入图像分解为光照成分和反射成分。光照估计:估计光照图以消除暗光区域。图像重建:将光照增强后的反射图像重建成最终图像。Retinexformer通过在Transformer中引入Retinex的图像增强思路,使得低光照图像的细节能够得到充分保留。本文提出了一种基于Retinexformer的低光照增强方法,用于改进YOLOv8模型在夜间和低光照环境下的目标检测性能。

博客 1929

字典树(前缀树)

什么是字典树? 叫前缀树更容易理解 字典树的样子 Trie又被称为前缀树、字典树,所以当然是一棵树。上面这棵Trie树包含的字符串集合是{in, inn, int, tea, ten, to}。每个节点的编号是我们为了描述方便加上去的。树中的每一条边上都标识有一个字符。这些字符可以是任意一个字符集中的字符。比如对于都是小写字母的字符串,字符集就是’a’-‘z’;对于都是数字的字符串,字...

越看越喜欢啊 11万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Trie树(字典树)c++实现

字典树简单介绍源码实现 简单介绍 字典树的实现有点类似编程题目的Huffman编码。构建一个树,把要记录的值作为边,然后记录该点是否是终点,可以用来字符串去重,快速查找字符串等。 具体原理可以参考:博客链接 源码实现 #include<iostream> #include<bits/stdc++.h> using namespace std; /*构建一个字典树 实现插入操作 实现查询是否存在 可以实现字符串去重(大量字符串的时候 */ const int MaxN = 26;/

glum_0111的博客 384

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

字典树(Trie/前缀树)

Trie 字典树 前缀树

good good study, day day up! 7868

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C++图解前缀树(字典树)

今天看到了最长公共前缀树的时候就突然想到了前几个星期学的前缀树。所以打算来写写。 试想有这样一种场景,我们现在手里有10W个单词,并且里面有重复的单词,如果我们使用传统的遍历手法查找一个单词,那么可能没等查出来交卷铃声已经响了。 或许有人会说使用哈希表,但是存在重复的单词,这个效率还是欠缺了点。 所以就引入了今天的主角—字典树。 字典树又称之为前缀树,是一个哈希表的变种,优于哈希表的查找速度。但是他的空间复杂度是十分复杂的,所以是一种空间换时间的做法。 ...

强者之路 1294

字典树模板

字典树,又称单词查找树,Trie树,是一种树形结构,典型应用是用于统计,排序和保存大量的字符串,所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度的减少无谓的字符串比较,查询效率比哈希表高。 字典树的应用: 字符串的快速检索哈希最长公共前缀 #include using namespace std; #define MAX 26 //字

Detective_Xin的专栏 4569

python 字典树

字典树(前缀树) 2018年08月24日 00:41:07 向前走别回头 阅读数 3516 版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.youkuaiyun.com/weixin_39778570/article/details/81990417 什么是字典树? 叫前缀树更容易理解 字典树的样子 这里写图片描述 ...

qq_25864597的博客 592

字典树(模版+源码)

Trie 树 字典树 最长公共前缀,,查询速度快于哈希

Sunshine 1427

字典树的实现

题目描述 字典树又称为前缀树或者Trie树,是处理字符串常用的数据结构。假设组成所有单词的字符仅是‘a’~‘z’,请实现字典树的结构,并包含以下四个主要的功能。 void insert(String word):添加word,可重复添加; void delete(String word):删除word,如果word添加过多次,仅删除一次; boolean search(String word):查询word是否在字典树中出现过(完整的出现过,前缀式不算); int prefixNumber(String

yangyangcome的博客 298

【算法学习】字符串 字典树Trie

方法三:字典树。回忆字典树的性质:根结点不包含字符,除根结点外的每个子结点都包含一个字符;从根结点到某一个结点,路径上的字符连接起来,就是该结点对应的字符串;每个结点所有的子结点包含的字符互不相同,即字典树基于公共前缀建树。 虽然做这种题有点杀鸡用牛刀的感觉,而且复杂度也不一定好到哪去。就当复习一下。插入和查找一个单词的复杂度是O(m),m是单词长度,n个单词大概是O(mn)。然后查找最长公共前缀...

memcpy0的博客 560

01字典树解析与模板

本文将解答: 1.01字典树是什么 2.01字典树用途 3.01字典树实现代码 4.每个数按位插入顺序 一、01字典树是什么 首先我们都知道普通字典树(不懂?忘记了?点这里 ),字典树是插入字符串,利用字符串的公共前缀来减少查找时间,01字典树其实就是按位插入数字(将数字转化为2进制串),所谓“按位”即将该数字按2进制拆分为每一位是0或1的数字。 二、01字典树的用处 01字典树一般都是用于求异或...

卖炫迈的小男孩的博客 535

数据结构篇——字典树(trie树)

引入 现在有这样一个问题, 给出\(n\)个单词和\(m\)个询问,每次询问一个单词,回答这个单词是否在单词表中出现过。 好像还行,用 map<string,bool> ,几行就完事了。 那如果n的范围是 \(10^5\) 呢?再用 \(map\) 妥妥的超时,说不定还会超内存。 这时候就需要一种强大的数据结构——字典树 基本性质 字典树,又叫Trie树、前缀树,用于统计,排...

CZC1999的博客 329

字典树(数组实现)理解

字典,一般是我们用来查找的工具,就拿牛津英语词典来说,它里面包含了数量庞大的单词,如果我们漫无目的的去找一个词,仿佛大海捞针.但是词典给每个单词进行了排序,排序的规则也很简单,按照单词每位字母的字母表顺序排列,相同的就按照下一位的顺序排.只要按照这个规则,我们想查找到一个单词也就很容易了.而字典树之所以被叫做字典树,就是因为它有着类似于字典的结构,方便了字符串的前缀匹配等问题. 字典树,顾名思义,就是一个树形结构,举个例子,假设有四个单词:a,abcd,acd,abc;建树过程如下: 第一个词为a.

qq_49593247的博客 526
上一篇: 设计模式——单例模式和工厂模式
下一篇: 海量数据处理的算法题目
蓬莱道人
博客等级 码龄11年 766粉丝 274原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值