首页 > 其他分享 >Trie树-字典树笔记

Trie树-字典树笔记

时间:2024-12-01 16:56:27浏览次数:6  
标签:&& Trie tree 笔记 int str 字符串 节点 字典

Trie树-字典树笔记

Trie树是一种高效的存储字符串的数据结构,它将多个字符串的前缀合并在一条边上,每次插入时,都判断当前的树上有无能够重合的前缀,如果没有就单独增加一个节点。通过合并前缀,可以做到快速查找已经优化空间的操作。

trie1

下面是使用数组模拟实现Trie树的部分代码:

我们首先定义一个二维数组来构造一个树结构

int tree[N][M];//N表示该树最多有几个节点,M表示每个节点最多伸出多少个枝,即最多有多少个儿子
int idx;//定义编号指针
int cnt[N];//定义计数数组,表示第N个节点到根节点的路径构成的字符串被插入了多少次

trans 转换字符操作:将字符转换为整数,作为树的枝(以字母和数字为例)

int trans(char x) {
    if (x >= 'A' && x <= 'Z') return x - 'A';//映射大写字母到 0~25
    if (x >= 'a' && x <= 'z') return x - 'a' + 26;//映射小写字母到 26~51
    if (x >= '0' && x <= '9') return x - '0' + 52;//映射数字到 52~61
}

insert 插入字符串操作:

void insert(char str[]) {//插入str这个字符串
    int p = 0, len = strlen(str);//从根节点出发
    for (int i = 0; i < len; i++) {//遍历字符串
        int c = trans(str[i]);//转换字符映射到整数
        if (!tree[p][c])//如果当前节点不存在 c 这个儿子(树枝)
            tree[p][c] = ++idx;//创建这个枝,然后给予编号
        p = tree[p][c];//走到这个节点
        cnt[p]++;//当前p节点到根节点的路径构成的字符串被插入次数加1
    }
}

find查找字符串操作:(也可以查找前缀)

int find(char str[]) {
    int p = 0, len = strlen(str);//从根节点开始查找
    for (int i = 0; i < len; i++) {
        int c = trans(str[i]);
        if (!tree[p][c])//如果当前节点不存在 c 这个儿子
            return 0;//返回0,没有找到匹配的浅醉
        p = tree[p][c];//存在 c 这个儿子,那么就走到 c 这个儿子节点上
    }
    return cnt[p];//遍历完需要查找的字符串,返回最后一个字符对应的插入的次数
}

以洛谷P8306为例:

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

int n, q, idx;
char s[3000010];
int tree[3000010][65], cnt[3000010];

int trans(char x) {
    if (x >= 'A' && x <= 'Z') return x - 'A';
    if (x >= 'a' && x <= 'z') return x - 'a' + 26;
    if (x >= '0' && x <= '9') return x - '0' + 52;
}

void insert(char str[]) {
    int p = 0, len = strlen(str);
    for (int i = 0; i < len; i++) {
        int c = trans(str[i]);
        if (!tree[p][c])
            tree[p][c] = ++idx;
        p = tree[p][c];
        cnt[p]++;
    }
}

int find(char str[]) {
    int p = 0, len = strlen(str);
    for (int i = 0; i < len; i++) {
        int c = trans(str[i]);
        if (!tree[p][c])
            return 0;
        p = tree[p][c];
    }
    return cnt[p];
}

int main()
{
    int t;
    scanf("%d", &t);
    while (t--) {
    
        for (int i = 0; i <= idx; i++)
            for (int j = 0; j <= 64; j++)
                tree[i][j] = 0;
        for (int i = 0; i <= idx; i++)
            cnt[i] == 0;
        idx = 0;//做完一轮测试后,重新初始化tree
        
        scanf("%d %d", &n, &q);
        for (int i = 0; i < n; i++) {
            scanf("%s", s);
            insert(s);
        }
        for (int i = 0; i < q; i++) {
            scanf("%s", s);
            printf("%d\n", find(s));
        }
    }
    return 0;
}

标签:&&,Trie,tree,笔记,int,str,字符串,节点,字典
From: https://www.cnblogs.com/dianman/p/18579954

相关文章

  • 升鲜宝生鲜配送供应链管理系统Mysql表结构数据字典的生成小工具V0.01
    最近最近要交付升鲜宝生鲜配送供应链管理系统源代码给上海的客户,需要将蓝湖UI设计图及数据字典交接给别人。在网上找了半天没有找到合适的根据Mysql生成Word数据字典,自己就写了几行代码,记录一下.后面可能会继续改造。主要的代码如下:usingSystem;usingSystem.Collections.Gene......
  • Activiti 学习笔记
    工作流概述每一项业务的开始和结束,都可以理解为一个工作流,例如,公司的费用报销的基本流程如下:员工先提出费用报销申请,提交给部门领导,部门领导审批后,提交给财务部门审批,审批完成后,通知提出申请的员工可以报销,报销流程结束。整个流程按照步骤完成,这就是一个简单的工作流。工作流可......
  • 泷羽sec-shell(7)for循环与while循环 学习笔记
      声明!学习视频来自B站up主**泷羽sec**有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!!有兴趣的小伙伴可以点击下面连接进入b站主页[......
  • 读书笔记
    读书笔记四:代码的质量与可维护性《程序员修炼之道》中,作者对代码的质量与可维护性进行了深入探讨。作为程序员,写出高质量、可维护的代码是保证项目成功的关键因素之一。作者指出,代码不仅是机器可以理解的指令,同样也是同事和后续维护者可以阅读和理解的人类语言。书中强调了“可读......
  • 深度学习笔记——BLIP2
    本文详细介绍多模态模型:BLIP2。推荐阅读:BLIP2-图像文本预训练论文解读【多模态】BLIP-2模型技术学习文章目录回顾BLIPBLIP的问题及BLIP2的优化1.模块化架构设计2.引入Q-Former模块3.分阶段训练策略4.减少计算开销BLIP2架构表征学习阶段RepresentationL......
  • 泷羽sec-shell(6)if条件判断与for循环结构 学习笔记
     声明!学习视频来自B站up主**泷羽sec**有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!!有兴趣的小伙伴可以点击下面连接进入b站主页[B......
  • Move 合约部署踩坑笔记:如何解决 Sui 客户端发布错误Committing lock file
    Move共学活动:快速上手Move开发为了帮助更多开发者快速了解和掌握Move编程语言,Move共学活动由HOH社区、HackQuest、OpenBuild、KeyMap联合发起。该活动旨在为新手小白提供一个良好的学习平台,带领大家一步步熟悉Move语言,并了解如何将其应用到Web3开发中。通过......
  • Git 学习笔记
    Git学习笔记安装Git:从官网下载,并在Github上下载相关汉化包配置Git:运行以下命令配置Git用户名和邮箱gitconfig--globaluser.name"YourName"gitconfig--globaluser.email"youremail@example.com"创建和克隆仓库:创建一个新的Git仓库:gitinit。克隆一......
  • 程序员修炼之道——从小工到专家读书笔记7
    第七章:软件工艺——追求卓越这一章深入探讨了软件工艺的核心价值,强调程序员应当追求卓越,将编程工作上升至艺术的高度。软件工艺不仅仅是一种技术层面的追求,更是一种态度上的体现。作为专业的程序员,应当以工匠的精神对待每一行代码,致力于编写高质量、易于维护的程序。在精益求精......
  • 《程序员修炼之道——从小工到专家》笔记5
    《程序员修炼之道》不仅是一本关于个人技能提升的书,它还深刻探讨了团队协作的重要性及有效方法。1.在团队中,良好的沟通是项目成功的关键。书中提倡开放、诚实的沟通环境,鼓励团队成员之间及时分享想法、问题和进展。有效的沟通能够减少误解,增强团队凝聚力,确保项目顺利进行。2.协......