Trie树(字典树) 个人模版

字典树详解(Trie树,前缀树) 用伪代码手把手构建字典树 阅读详情

Trie树的基本实现

字母树的插入(Insert)、删除( Delete)和查找(Find)都非常简单,用一个一重循环即可,即第i 次循环找到前i 个字母所对应的子树,然后进行相应的操作。实现这棵字母树,我们用最常见的数组保存(静态开辟内存)即可,当然也可以开动态的指针类型(动态开辟内存)。至于结点对儿子的指向,一般有三种方法:

1、对每个结点开一个字母集大小的数组,对应的下标是儿子所表示的字母,内容则是这个儿子对应在大数组上的位置,即标号;

2、对每个结点挂一个链表,按一定顺序记录每个儿子是谁;

3、使用左儿子右兄弟表示法记录这棵树。

三种方法,各有特点。第一种易实现,但实际的空间要求较大;第二种,较易实现,空间要求相对较小,但比较费时;第三种,空间要求最小,但相对费时且不易写。

这里采用第一种,速度较快,适合ACM竞赛。

孩子数组大小自定义,此处默认为字母数26;

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <cmath>


using namespace std;


typedef struct Trie
{
    int nCount; //该节点前缀 出现的次数
    struct Trie *next[26]; //孩子结点
}Trie;

Trie Memory[1000000]; //先分配内存 malloc费时间
int allocp = 0;

//初始化节点。nCount计数为1,next都是为NULL
Trie * InitNode()
{
    Trie * tmp = &Memory[allocp++];
    tmp->nCount = 1;
    for(int i=0;i<26;i++)
        tmp->next[i]=NULL;
    return tmp;
}
void insertTrie(Trie * * pRoot, char * str)
{
    Trie * tmp = *pRoot;
    int i=0,k;
    //逐个插入
    while(str[i])
    {
        k=str[i]-'a';
        if(tmp->next[k])
        {
            tmp->next[k]->nCount++;
        }else
        {
            tmp->next[k]=InitNode();
        }
        tmp = tmp->next[k];
        i++;
    }
}
int searchTrie(Trie *root,char *str)
{
    if(root==NULL)
        return 0;
    Trie *tmp = root;
    int i=0,k;
    while(str[i])
    {
        k=str[i]-'a';
        if(tmp->next[k])
        {
            tmp = tmp->next[k];
        }else
        {
            return 0;
        }
        i++;
    }
    return tmp->nCount; //返回最后那个结点保存的ncount
}
int main()
{
    int m,n;
    char s[11];
    Trie * root = InitNode();
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%s",s);
        insertTrie(&root,s);
    }
    scanf("%d",&m);
    for(int i=0;i<m;i++)
    {
        scanf("%s",s);
        printf("%d\n",searchTrie(root,s));
    }
    return 0;
}



C++———trie树字典树个人解析 这是用到数组实现的,每个父节点最多都会有26个子节点,这分别对应了26个字母,在插入的过程之中会用到一个idx表示插入了多少个节点。比如根节点的子节点a为son[0][1]=1,然后通过索引1可以插入a的子节点son[1][2]=b的插入排序数字。u的作用是存储的字母的ASCII码值,判断在son[][]二维数组中存储在哪,也就是说会存储在son[][u]的位置,并且位置表示字母,数组里面存储的是索引,是用来查找下一个字母的。根节点是空节点,在实现字典树的过程中就像一个树。这道题可以使用字典树思想。 阅读详情

相关推荐

STM32硬件SPI调试ADS1256的3个致命坑,CubeMX配置避坑指南

本文深入解析STM32硬件SPI调试ADS1256高精度ADC芯片时常见的3大配置陷阱,包括SPI时钟频率、时钟极性与相位、数据字节序等关键问题。通过CubeMX实战配置指南和实测数据对比,提供稳定可靠的解决方案,帮助开发者避免常见错误,提升采样精度和系统稳定性。

weixin_42550597的博客 346

HDU - 1251 统计难题

https://vjudge.net/problem/HDU-1251 #include<iostream> #include<algorithm> #include<unordered_map> #include<cstring> using namespace std; int main() { char a[15],b[15]; unordered_map<string,int> q; while(cin.getline(a,11)

斯文~ 256

VSCode关联VIVADO编辑Verilog

有时候接手别人的代码,或者从网上找的开源代码,每个人风格不一致,对齐缩进也不一样,阅读起来很累。有没有什么方法能快捷地格式化代码呢。下面我们利用VSCode插件来实现这个需求。Vivado是Xilinx公司提供的逻辑开发平台(之一),如果不喜欢Vivado自带的文本编辑器,可以选择第三方的文本编辑器VSCode。

小王在努力...的博客 7150

ACM_模板_字典树

字典树Trie是一门比较简单也比较好懂的算法,因为字典本身是生活中使用率较高的工具,字典的工作原理大家也都懂,其本质也就是前缀查询,对前缀查询的方法,大家很容易可以想到数据结构中的链表结构,用指针去实现一个连接作用。在这里,小编先讲解一下数的指针建立。 首先因为我们字母只有26个,每个节点的指向可以加一个26节点的指针(不考虑大小写),在每输入一个字符串的时候就建立节点。 小编先给出指针实现的

RaAlGhul的博客 960

图像加密与解密(附matlab代码)

详细介绍了三种图像加密解密原理,并基于matlab开发了一套相应系统。

2440

别再卡在Google验证了!用Header Editor插件5分钟搞定TryHackMe注册(附最新.json规则)

本文提供了使用Header Editor插件快速解决TryHackMe注册时Google验证失败问题的详细指南。通过导入特定的JSON规则文件,用户可以轻松绕过网络限制,5分钟内完成账号注册,无需复杂设置。文章包含完整的配置步骤、常见问题解决方案以及安全使用建议。

weixin_30736301的博客 462

ACM_字典树模板

函数部分struct node { int t; node *child[2]; //看情况开大小 node() //结构体初始化 { t=0; for (int i=0 ;i<2; i++) { child[i]=NULL; } } };

知足常乐的博客 501

STM32串口通信实战:从CubeMX配置到printf重定向全解析

串口通信是嵌入式系统中最基础且广泛使用的数据交换方式,它基于异步串行通信原理,通过TX(发送)和RX(接收)两根信号线实现设备间的全双工通信。其技术价值在于协议简单、硬件成本低、可靠性高,是单片机与上位机调试、传感器数据采集、设备控制等场景的首选方案。在STM32等ARM Cortex-M系列MCU中,USART外设通过硬件自动处理时序,大大减轻了CPU负担。本文聚焦于嵌入式竞赛与开发中的高频需求,以STM32G431RBT6为例,详解通过CubeMX配置USART1、实现按键触发数据发送、并完成print

weixin_30603633的博客 545

字典树(Trie树)用法及例子(一)

字典树(Trie)概述字典树,又名Trie树。顾名思义,在字典中很好用。我们在查牛津词典时都是先按第一个字母找到以这个字母为首的单词所在的初始位置,在此位置的基础上,再按照第二个字母继续找。。。 插一句,字符串的字典序也是这个意思,先按照第一个字母排序,第一个字母相同的情况下再按照第二个字母排序。 字典树的数据结构图: 注意:节点中的value并不存储字符,节点中的value按需使用。每个

不积跬步,无以至千里 8122

ATECC508A芯片开发笔记(三):获取508A串号、随机数源码及I2C抓包分析

ATECC508A芯片开发笔记(三):读取508A串号、获取随机数源码及I2C抓包分析 APP层函数编写及源码分析 At508_GetSernum() GetSernum抓包记录 At508_GetRandom( ) GetRandom抓包记录 经过前两章节,CryptoAuthlib库已经成功适配在代码中了,下面简单测试一下API函数,并分析下I2C通讯流程: APP层函数编写及源码分析利用li

HowieXue 薛永浩的博客 2万+

【RKNN】RKNN(Rockchip Neural Network)​​ 的详解

RKNN 为 Rockchip 硬件提供了高效的 AI 推理解决方案,适合需要低功耗、实时响应的边缘场景

浩瀚之水的专栏 1684

hdu 1251 字典树,指针版

这题内存需求很大,我用静态数组写的trie总MLE,看discuss说50w的数组才过,但我一开50w的就MLE了啊……想不通 这是链表版的trie,1个case,所以也不用考虑内存释放什么的 #include&lt;cstdio&gt; #include&lt;cstring&gt; #include&lt;cstdlib&gt; using namespace std; struct...

xuela-net 195

全志V3S嵌入式驱动开发(解决kernel 5.2.y wifi驱动问题)

​【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 wifi模块,之前测试的时候,开发板上用的是esp8089,当时内核时4.14.y,测试也是通过的。链接地址在这里, https://blog.youkuaiyun.com/feixiaoxing/article/details/131178420?spm=1001.2014.3001.5501 那个时候测试的时候,我们就说过,wifi驱动可能是除了镜像制作之外,最复杂的一个

嵌入式-老费,一个分享专业嵌入式知识的blog 1158

Trie树(字典树,前缀树,键树)分析详解

Trie树概述   Trie树,又称字典树、前缀树、单词查找树、键树,是一种多叉树形结构,是一种哈希树的变种。Trie这个术语来自于retrieval,发音为/tri:/ “tree”,也有人读为/traɪ/ “try”。Trie树典型应用是用于快速检索(最长前缀匹配),统计,排序和保存大量的字符串,所以经常被搜索引擎系统用于文本词频统计,搜索提示等场景。它的优点是最大限度地减少无谓的字符串比较,查

Hyman's Blog 2万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Trie树(字典树)

Trie树,又叫字典树前缀树(Prefix Tree)单词查找树或键树,是一种多叉树结构。如下图:上图是一棵Trie树,表示了关键字集合{“a”, “to”, “tea”, “ted”, “ten”, “i”, “in”, “inn”}。根节点不包含字符,除根节点外的每一个子节点都包含一个字符。从根节点到某一个节点,路径上经过的字符连接起来,为该节点对应的字符串。每个节点的所有子节点包含的字符互不相同。通常在实现的时候,会在节点结构中设置一个标志,用来标记该结点处是否构成一个单词(关键字)。

2301_80224556的博客 2781

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Trie树(字典树)

Trie树,也叫做字典树,是一种树形结构。往往用于统计和排序大量的字符串前缀来减少查询时间,最大限度的减少字符串比较。 Trie树的核心便是用空间来换取时间,而Trie在算法中也往往采用数组来进行模拟,利用字符串的公共前缀来降低查询时间来达到提高效率的目的。 下面这个图便是字典树。 建立的字典树的流程便是 如何查询 查询的流程其实跟插入差不多。 推荐例题 题目链接给定 nnn 个模式串 s1,s2,…,sns_1, s_2, \dots, s_ns1​,s2​,…,sn​ 和 qqq 次询问,每次询问给定

congyuyoudao的博客 1080

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

trie树(字典树)

字典树(Trie),也称为前缀树或单词查找树,是一种用于存储字符串集合的数据结构,特别适用于处理前缀相关的问题。字典树的基本特点是通过共享公共前缀来节省存储空间,并且可以高效地进行字符串查询操作。

buaichifanqie的博客 1657

字典树Trie

字典树字典树——Trie树,又称为前缀树(Prefix Tree)、单词查找树或键树,是一种多叉树结构。

一只程序猿 9729

Trie 字典树 前缀树

Trie 字典树 前缀树

底层码农 6675

trie(字典树、前缀树)

trie(字典树、前缀树) 1. trie原理 原理 trie树,又被称为字典树、前缀树,是一种高效地存储和查找字符串集合的数据结构。 一般来说,用到trie的题目中的字母要么全是小写字母,要么全是大写字母,要么全是数字,要么就是0和1。也就是说字母的个数不是很多。 如下是一个trie树的例子: 真实存储中,图中的每个字符都是被存储在边上的,节点是不存储字符信息的。 查询某个字符串S是否在这个字符串集合中是否存在的话,可以从根开始遍历,当遍历到空节点或者S已经遍历结束但是trie树中对应节点不是

weixin_42638946的博客 3664

Trie树(前缀树、字典树)

目录 什么是前缀树 前缀树的优缺点: 前缀树的应用 什么是前缀树 Trie树,又叫字典树、前缀树(Prefix Tree)、单词查找树 或 键树,是一种多叉树结构。如下图: 好比假设有b,abc,abd,bcd,abcd,efg,hii 这6个单词,那我们创建trie树就得到 上图可以归纳出 Trie 树的基本性质: 1. 根节点不包含字符,除根节点外的每一个子节点都包含一个字符。 2. 从根节点到某一个节点,路径上经过的字符连接起来,为该节点对应的字符串。 3. 每个节点的所有子节

u011764940的博客 3639

[算法日常] 字典树(Trie树)

字典树(Trie树)详解&例题

Brilliant_Sky的博客 1406

数据结构 Trie树(字典树、前缀树)

Trie树(字典树/前缀树)是一种多叉树结构,用于高效存储和查询字符串集合。其特点包括:根节点不含字符,路径代表字符串,公共前缀共享路径。Trie树支持插入、查询完整字符串和前缀统计等操作,时间复杂度均为O(L),其中L为字符串长度。实现时使用动态分配的idx标识节点,通过二维数组存储子节点关系。应用场景包括单词查找、输入法提示等。虽然存在内存消耗大的缺点,但通过压缩优化(如RadixTree)可改善。Trie树在前缀处理方面具有独特优势,是字符串处理的重要数据结构。

似流水般平静而坚定。 968

Trie 树(字典树)

字典树(Trie树)是一种高效处理字符串的多叉树结构,广泛应用于字典存储、字符串检索、前缀统计等场景。其核心优势在于通过共享前缀减少字符串比较,提高查询效率。字典树的基本操作包括插入和查询,时间复杂度与字符串长度线性相关。针对不同需求,可通过优化存储结构(如孩子兄弟表示法)处理大规模字符集问题。典型应用包括字符串检索、前缀统计、异或运算优化等。字典树在搜索引擎词频统计等实际系统中具有重要价值,能有效平衡时间与空间复杂度。

Mark1277的博客 985

算法设计与分析——字典树(前缀树、Trie树)

字典树又称单词查找树、前缀树、Trie树等,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它可以利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。它还有很多变种,如后缀树、Radix Tree、PATRICIA tree、crit-bit tree等等。 定义 在计算机科学中,Trie树(前缀树/字典树)是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键

冯·诺依曼 1万+
上一篇: Codeforces Round #262 (Div. 2) C
下一篇: Codeforces Round #263 (Div. 2) proA
Notdeep__acm
博客等级 码龄12年 20粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值