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]的位置,并且位置表示字母,数组里面存储的是索引,是用来查找下一个字母的。根节点是空节点,在实现字典树的过程中就像一个树。这道题可以使用字典树思想。 阅读详情

相关推荐

Java实战:用Proj4j搞定WGS84与CGCS2000坐标互转(附完整代码)

本文详细介绍了如何使用Java库Proj4j实现WGS84与CGCS2000坐标系之间的高精度转换。通过七参数转换模型和格网改正量文件,提供完整的代码实现和项目配置指南,帮助开发者快速集成到地理信息系统项目中,提升坐标转换效率和精度。

weixin_29251567的博客 828

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

模拟IC设计避坑:手把手教你用Cadence仿真恒定跨导轨到轨运放(附完整工艺库文件)

本文详细解析了使用Cadence仿真恒定跨导轨到轨运放的全流程,涵盖电路原理、工艺库配置、尺寸设计及仿真分析。通过1:3电流镜补偿技术实现跨导稳定,提供CSMC 0.25um工艺下的实战案例,帮助工程师规避设计陷阱,提升模拟IC设计效率。

weixin_30952535的博客 494

ACM_模板_字典树

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

RaAlGhul的博客 960

告别校准烦恼:用ADS1220和松下ERA3电阻实现±0.05℃精度的Pt100测温方案(附完整电路图)

本文详细介绍了如何利用TI的ADS1220 24位ΔΣ ADC与松下ERA3系列精密电阻构建±0.05℃精度的免校准Pt100测温系统。通过比例测量法架构和关键器件选型,解决了传统方案中的校准繁琐和长期稳定性问题,特别适用于工业控制、医疗设备等高精度温度测量场景。

weixin_30740581的博客 612

Excel插件开发实战:从零封装一个带自定义Ribbon的.xlam工具包

本文详细介绍了如何从零开发一个带自定义Ribbon的Excel插件.xlam工具包。通过VBA和XML技术,读者将学习到插件架构设计、Ribbon界面定制、模块化开发以及企业级部署策略,帮助提升Excel自动化办公效率。

weixin_42531128的博客 516

ACM_字典树模板

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

知足常乐的博客 501

CAT24C16 EEPROM的I²C页写与页读底层实现

I²C是一种广泛应用于嵌入式系统的双线同步串行通信协议,其核心在于严格的时序控制、地址寻址机制与主从应答逻辑。理解I²C总线物理层(上拉电阻、SCL/SDA电气特性)、协议层(START/STOP、ACK/NACK、7位地址格式)及外设寄存器操作(如SR1状态标志、CCR时钟分频),是实现可靠通信的基础。在实际工程中,EEPROM类器件(如CAT24C16)因其非易失性、页缓冲区结构和写保护(WP)功能,成为数据持久化关键载体;其16字节页写约束、内部写周期(5–10ms)与地址指针自动递增等特性,直接决定

weixin_42591413的博客 388

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

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

不积跬步,无以至千里 8122

保姆级教程:用NVIDIA Jetson AGX Xavier和GMSL2相机搭建8路车载视觉原型系统

本文提供了一份详细的教程,指导如何使用NVIDIA Jetson AGX Xavier开发板和GMSL2相机搭建8路车载视觉原型系统。内容涵盖硬件选型、系统架构设计、软件环境配置、多路视频采集实现以及性能优化与问题排查,帮助开发者快速掌握GMSL2技术在车载视觉系统中的应用。

weixin_42525005的博客 295

笔试题-2023-星宸-数字IC设计【纯净题目版】

4 笔试题-2023-星宸-数字IC设计【纯净题目版】

w0shishabi的博客 1171

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

脉冲变压器电感选型参数,结构原理,工艺与注意问题总结

脉冲变压器电感简称脉冲变压器,是一种特殊类型的变压器,主要用于处理脉冲信号。它的主要特性是能够在短时间内承受高电压和大电流。脉冲变压器主要用于开关电源、脉冲功率放大、雷达脉冲调制等领域。本文对脉冲变压器的工作原理,结构特点,工艺流程,选型参数及设计注意事项进行总结。

fydar的博客 1342

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

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

Hyman's Blog 2万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Trie树(字典树)

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

2301_80224556的博客 2781

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Trie树(字典树)

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

congyuyoudao的博客 1080

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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、付费专栏及课程。

余额充值