字典树(Trie树)

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 字典树(Trie树),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源: 原文

目录

题目1 

 代码

题目2 

​代码

🍔🍔🍔代码分析


🍔Trie树🍔

用处:高效地存储字符串集合的数据结构

概述:就是一个树状结构的存储方式,使用二维数组来存储,其中包含了父结点和子结点,从上向下开始遍历,看是否能够找到对应的结点,从而判断能否找到对应的字符串 

存储方法(注意标记结束结点)

字典树(Trie树)

图像来源: AcWing 835. Trie字符串统计 – AcWing 

下面的结点都是新开辟的结点,u代表字母,来确定结点的具体位置 

字典树(Trie树)

不知道为什么,这个题在y总的课里面是基础算法,但是在洛谷上却是普及+的

那么下面就先给出两道简单的(可以作为模板使用) 

字典树(Trie树)

回归正题 

题目1 

[NOI2000]单词查找树 (nowcoder.com)

字典树(Trie树)

字典树(Trie树)

 代码

#include<bits/stdc++.h>
using namespace std;
const int N=10010;
int son[N][26],cnt[N],idx;
void insert(string s)
{
    int p=0;
    for(int i=0;i<s.size();i++)
    {
        int u=s[i]-'A';
        if(!son[p][u]) son[p][u]=++idx;
        p=son[p][u];
    }
    cnt[p]++;
}
int main()
{
    string s;
    while(cin>>s)
    {
        insert(s);
    }
    cout<<idx+1<<endl;
    return 0;
}

while(cin>>s)

边输入边循环,直到输入到结束符EOF为止 

题目2 

835. Trie字符串统计 – AcWing题库

字典树(Trie树) 代码

#include <iostream>

using namespace std;

const int N = 100010;

int son[N][26], cnt[N], idx;
char str[N];

void insert(char *str)
{
    int p = 0;
    for (int i = 0; str[i]; i ++ )
    {
        int u = str[i] - 'a';
        if (!son[p][u]) son[p][u] = ++ idx;
        p = son[p][u];
    }
    cnt[p] ++ ;
}

int query(char *str)//str[]
{
    int p = 0;
    for (int i = 0; str[i]; i ++ )
    {
        int u = str[i] - 'a';
        if (!son[p][u]) return 0;
        p = son[p][u];
    }
    return cnt[p];
}

int main()
{
    int n;
    scanf("%d", &n);
    while (n -- )
    {
        char op[2];
        scanf("%s%s", op, str);
        if (*op == 'I') insert(str);//op[0]
        else printf("%d\n", query(str));
    }

    return 0;
}

🍔🍔🍔代码分析

⭐代码里面的int son[N][26],不能写成int  son[N][N],

因为N就很大了,如果写成son[N][N],相当于存储的是N * N,会爆int 

int son[N][26];

son[][]存储子节点的位置,因为有26个字母,所以分支最多26条 

⭐ int u = str[i] – ‘a’;

用来记录每个字母的位置是什么

insert()

     if (!son[p][u]) son[p][u] = ++ idx;    p = son[p][u];

如果不存在这个结点不存在它的儿子的话,就创建一个结点,它的值为下一个结点的位置上的值

否则  使 p 指针指向下一个位置

相当于:有路的话,就走下去(idx++),否则建一条路也要走下去(p) 

     query()

     if (!son[p][u]) return 0;   p = son[p][u];

如果不存在这个结点的话,就是没有查询到,就要返回0(return 0)

否则  使 p 指针指向下一个位置

cnt[]存储以某节点结尾的字符串个数(同时也起标记作用)

cnt[p]++:表示以这个结点结尾的字符串的个数+1

return cnt[p]; 返回字符串出现的次数 

++idx

当前插入的结点是哪一个,加入新的结点就用++idx分配出一个下标

 Code over!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/131362.html

(0)
飞熊的头像飞熊bm
0 0

相关推荐

  • Springboot使用Mybatis执行多条sql(Cause:java.sql.SQLException:sql injection violation,multi-statement not ) 技术随笔

    Springboot使用Mybatis执行多条sql(Cause:java.sql.SQLException:sql injection violation,multi-statement not )

    0 0174
    小半的头像 小半
    2023年1月13日
  • count(*)的理解(mysql45讲) 技术随笔

    count(*)的理解(mysql45讲)

    0 0139
    飞熊的头像 飞熊
    2024年1月29日
  • 【吐血推荐 七】程序员用到的软件 技术随笔

    【吐血推荐 七】程序员用到的软件

    0 098
    Java朝阳的头像 Java朝阳
    2024年3月31日
  • MySQL初级之【3.数据库用户管理、备份与设计】 技术随笔

    MySQL初级之【3.数据库用户管理、备份与设计】

    0 0191
    飞熊的头像 飞熊
    2023年7月31日
  • vue element admin 后台请求Uncaught (in promise) Error: Error at __webpack_exports__.def问题 技术随笔

    vue element admin 后台请求Uncaught (in promise) Error: Error at __webpack_exports__.def问题

    0 0289
    飞熊的头像 飞熊
    2023年8月9日
  • keras和tensorflow猫狗图像分类 技术随笔

    keras和tensorflow猫狗图像分类

    0 0140
    飞熊的头像 飞熊
    2023年5月14日
  • MySQL数据库配置信息查看和修改 技术随笔

    MySQL数据库配置信息查看和修改

    0 0212
    飞熊的头像 飞熊
    2023年8月3日
  • Java基础抽象类详解 技术随笔

    Java基础抽象类详解

    0 0122
    小半的头像 小半
    2023年2月8日
  • [Spring Framework]注解开发③(依赖注入) 技术随笔

    [Spring Framework]注解开发③(依赖注入)

    0 0177
    飞熊的头像 飞熊
    2023年3月3日
  • Servlet注解配置(代码演示) 技术随笔

    Servlet注解配置(代码演示)

    0 0119
    小半的头像 小半
    2023年1月13日
  • Mac下brew安装elasticsearch 技术随笔

    Mac下brew安装elasticsearch

    0 0181
    飞熊的头像 飞熊
    2023年9月22日
  • Spring 框架(Spring Framework)使用详解 技术随笔

    Spring 框架(Spring Framework)使用详解

    0 0110
    Java光头强的头像 Java光头强
    2023年2月18日

发表回复

登录后才能评论

站长精选

  • Git操作你还在用merge么?了解了解rebase吧!

    Git操作你还在用merge么?了解了解rebase吧!

    2023年11月12日

  • 一个通用的 PDF 文件处理工具,完全开源!

    一个通用的 PDF 文件处理工具,完全开源!

    2023年8月10日

  • SpingBoot的5个扩展点,超级实用!

    SpingBoot的5个扩展点,超级实用!

    2024年1月11日

  • 从 Future 到 CompletableFuture:简化 Java 中的异步编程

    从 Future 到 CompletableFuture:简化 Java 中的异步编程

    2023年8月20日

  • 推荐给你3个完美替代 Navicat 的工具

    推荐给你3个完美替代 Navicat 的工具

    2023年12月3日

  • SpringCloud 组件性能优化技巧

    SpringCloud 组件性能优化技巧

    2023年8月10日

  • 一款开源的、跨平台的 API 开发测试工具,中小团队提效神器!

    一款开源的、跨平台的 API 开发测试工具,中小团队提效神器!

    2024年4月17日

  • 告别卡顿困扰:IDEA 性能优化设置

    告别卡顿困扰:IDEA 性能优化设置

    2023年3月3日

  • 这款轻量级 Java 表达式引擎,逼格太高了!

    这款轻量级 Java 表达式引擎,逼格太高了!

    2023年9月27日

  • 漫画轻松看懂如何用 Kubernetes 实现 CI/CD

    漫画轻松看懂如何用 Kubernetes 实现 CI/CD

    2023年7月20日

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!

聚圣源古筝培训班起名字给牛起名字打字练习软件女婴起名王者荣耀配对测试爱情 起名企业起名 测名姓氏惠起名勾魂尤物小学教育毕业论文志当存高远什么意思阶乘计算器瑜伽馆起什么名字好女子起名猪年张姓宝宝起名字大全目前甘姓人口起名字女孩名字大国崛起下载五行属木的字男孩起名周芷兰台北人读后感刺五加的副作用五行八字起名字测名高性起名男孩名字小汤山名字由来夸克币卜起名可爱动漫女生图片魔兽防守地图下载色老汉影院天尊重生重生之暗巫术士淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化