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

相关推荐

移动硬盘报错0x80070570?5分钟搞定CHKDSK修复(附详细参数说明)

本文针对移动硬盘报错0x80070570问题,提供了详细的CHKDSK修复方法。通过5分钟核心修复流程,指导用户使用系统自带工具快速修复文件系统逻辑错误,恢复硬盘访问。文章还深入解析了CHKDSK参数,并提供了备选数据恢复方案与日常防护建议。

app77的博客 234

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

Pytorch transformers tokenizer 分词器词汇表添加新的词语和embedding

NLP添加新词汇

7322

ACM_模板_字典树

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

RaAlGhul的博客 960

在linux上本地大模型部署与推理

您的Python脚本(客户端)可能在您的个人电脑上,而模型服务(服务器)在远程Linux服务器上。如果您的服务器有强大的NVIDIA GPU,并且您对性能有更高的要求(例如需要高吞吐量),vLLM是更好的选择。这种方式无需向公网暴露服务器端口,而是通过加密的SSH通道将服务器的端口“映射”到您的本地电脑上。我们将启动一个API服务器,它会加载您指定的模型,并等待您的代码前来调用。如果您直接在SSH窗口运行上面的命令,一旦您关闭窗口,服务就会停止。这是根据您的原始代码修改的版本,适配本地vLLM服务。

frostmelody 全网同名,大家多多关注呀~ 持续分享优质内容! 2053

ACM_字典树模板

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

知足常乐的博客 501

升降机SEW MOVIDRIVE变频器设置

选择PO1 第2,3,9,13 位,点击“SendPA”Start reference,编码器反馈值为0(PI2/3 Actual position=0)提示:传送参考位置前请断开变频器安全24V电源,否则会弹出禁止修改提示框;提示:做这一步时,如果出现电机不能转动,或产生报警不能通过编码器匹配。下载配置的参数,提示:下载参数需要断开变频器的安全24V电源。编码器匹配通过后点击下一步,进入下图画面传送参考位置。1电机不能转动:a可能是由于变频器的安全24V未给。点击2.SEW总线扩展定位,定位块设置。

xdpcxq的专栏 5395

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

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

不积跬步,无以至千里 8122

微信本地数据解密实战:从AES加密原理到EnMicroMsg.db恢复指南

数据加密是保障信息安全的核心技术,其中对称加密算法AES因其高效可靠,被广泛应用于各类本地数据保护场景。其原理是通过特定密钥对数据进行混淆转换,确保未经授权者无法读取原始内容。在移动应用领域,本地数据库加密对于保护用户隐私、防止数据泄露具有重要价值。微信作为国民级应用,对其本地存储的聊天记录数据库(EnMicroMsg.db)采用了基于设备标识和用户UIN生成的AES-256-CBC加密方案。理解这一机制,不仅有助于在合法合规前提下进行个人数据备份与恢复,也为开发者进行客户端安全分析、兼容工具开发提供了基础

weixin_30764883的博客 570

基于STM32、HAL库的IP2736U_EF快充协议芯片简介及驱动程序设计

@param connected: 连接状态指针 (1=已连接, 0=未连接)= 0x2736) // 检查厂商ID。* @param hip: IP2736U句柄指针。* @param hip: IP2736U句柄指针。* @param hip: IP2736U句柄指针。* @param hip: IP2736U句柄指针。* @param hip: IP2736U句柄指针。* @param hip: IP2736U句柄指针。* @param hip: IP2736U句柄指针。

corlin6688的博客 430

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

QML实现ListView的拖动排序

现有一种需求,就是用鼠标拖动某项,动态去改变某一项在ListView中显示的顺序位置,经过研究及实践实战,实现方式的核心代码如下: import QtQuick 2.4 import QtQuick.Controls 1.3 import QtQuick.Window 2.2 import QtQuick.Dialogs 1.2 Rectangle { width: 800 ...

草上爬的博客 7564

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

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

Hyman's Blog 2万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Trie树(字典树)

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

2301_80224556的博客 2781

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Trie树(字典树)

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

congyuyoudao的博客 1080

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

余额充值