Trie树(详解+例题)

1、介绍Trie树

Trie树,即字典树,又称单词查找树或键树,是一种树形结构,每个节点保存一个字符,一条路径表示一个字符串。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较。

Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。

2、应用及基本性质

  • 要么存储小写字母/大写字母

  • 要么存储数字

  • 要么存储0或1

  • 不会出现混着存的情况(比如:既存大写字母又存小写字母还存数字这种)

  1. 根节点不包含字符,除根节点外每一个节点都只包含一个字符。

  2. 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。

  3. 每个节点的所有子节点包含的字符都不相同。

3、实现

  • 根据上述例子:过程如下(以abcdef,abdef,abc为例子)其他同理

  • 首先创建根节点root,刚开始根节点不存在a,所以创建a节点

  • 接着往下走,在a节点下插入字符b,节点a下不存在子节点b,创建节点b。

  • 继续走,在b节点下插入字符c,节点b下不存在子节点c,创建节点c。

  • 接着上述过程(假设创建到最后一个),我们创建到了f节点,此字符串结束,在末尾做一个标记,插入字符串abcdef完成


  • 再插入字符串abdef

  • 首先插入a节点,发现root下有子节点a,所以不用创建,继续。

  • 插入字符b节点,发现a下有子节点b,所以不用创建,继续。

  • 插入字符d节点,发现b下没有子节点d,所以创建d子节点,继续。

  • 插入字符e节点,发现d节点下没有子节点e,所以创建子节点e,继续。

  • 插入字符f节点,发现e节点下没有子节点f,所以创建子节点f,继续。

  • 插入结束,在字符串结尾做一个标记,表示完成插入字符串


  • 插入abc

  • 首先插入a节点,发现root下有a节点,所以不用创建,继续。

  • 再插入b节点,发现a节点下的子节点也有b,所以不用创建,继续。

  • 再插入c同样,发现b节点下的子节点有c,所以不用创建,完成 插入,做一个标记。


3.1、代码模板
int idx; //各个节点的位置,编号
int son[N][26]; //trie树
int cnt[N];//标记以某个编号结尾的单词的个数
//插入
void insert(string s)
{int p = 0; //刚开始指向根部节点(root)for(int i=0;i<s.size();i++){//将字母映射成数字(a->0,b->1,c->2)依次类推z->25;int u = s[i] - 'a';//如果当前没有此节点,创建这个节点,分配位置(编号)if(!son[p][u]) son[p][u] = ++idx; //新节点的编号是idx+1p = son[p][u];}cnt[p]++;
}
//查找单词操作
int query(string s)
{int p = 0; //指向根节点for(int i=0;i<s.size();i++){//将当前字符转换成数字(a->0, b->1,...)int u = s[i] - 'a';//如果走不通了,即树中没有保存当前字符//则说明树中不存在该字符串if(!son[p][u]) return 0;p = son[p][u];//指向下一个节点}//循环结束的时候,p 等于字符串 s 的尾字符所对应的 idx// cnt[p] 就是字符串 s 出现的次数return cnt[p];
}

4、例题835. Trie字符串统计 - AcWing题库

 


AC代码:
#include<iostream>
#include<cstring>using namespace std;const int N = 1e5;
int idx;
int son[N][26];
int cnt[N];//插入
void insert(string s)
{int p = 0;//指针指向for(int i=0;i<s.size();i++){int u = s[i] - 'a'; //映射//如果不存在该节点,创建一下//新节点编号idx+1if(!son[p][u]) son[p][u] = ++idx;p = son[p][u];//指向下一个节点}cnt[p]++;
}//查找
int query(string s)
{int p = 0;for(int i=0;i<s.size();i++){int u = s[i] - 'a';if(!son[p][u]) return 0;p = son[p][u];}return cnt[p];
}int main()
{int n;scanf("%d", &n);while(n --){string op,str;cin >> op >> str;if(op == "I"){insert(str);}else if(op == "Q"){int res = query(str);cout << res << endl;}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/542182.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java代码审计安全篇-反序列化漏洞

前言&#xff1a; 堕落了三个月&#xff0c;现在因为被找实习而困扰&#xff0c;着实自己能力不足&#xff0c;从今天开始 每天沉淀一点点 &#xff0c;准备秋招 加油 注意&#xff1a; 本文章参考qax的网络安全java代码审计和部分师傅审计思路以及webgoat靶场&#xff0c;记录…

ASP.NET Mvc+FFmpeg+Video实现视频转码

目录 首先&#xff0c;做了视频上传的页面&#xff1a; FFmpeg&#xff1a;视频转码 FFmpegHelper工作类&#xff1a; 后台控制器代码&#xff1a; 前端视图代码&#xff1a; 参考文章&#xff1a; 首先&#xff0c;做了视频上传的页面&#xff1a; 借鉴了这篇文章 ASP.…

【Miniconda】基于conda列出当前环境下所有已创建的虚拟环境

【Miniconda】基于conda列出当前环境下所有已创建的虚拟环境 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您的…

代理IP速度变慢的原因是什么,要如何解决?

许多用户在使用代理IP时都可能会遇到网络速度变慢的问题&#xff0c;这和我们很多人使用代理IP的初衷背道而驰了&#xff0c;所以&#xff0c;代理IP的网络延迟到底是什么原因造成的&#xff0c;我们又要如何解决这个问题呢&#xff1f;今天就和大家一起来探讨探讨。 一、原因 …

C#,图论与图算法,无向图断开点(Articulation Points)的算法与源代码

1 无向图断开点 如果移除无向连通图中的顶点(以及穿过该顶点的边)会断开该图,则该顶点是一个连接点(或切割顶点Cutting Point)。连接点表示连接网络中的漏洞–单点故障会将网络拆分为两个或多个组件。它们对于设计可靠的网络很有用。 对于断开连接的无向图,连接点是顶点…

SSM SpringBoot vue智能手机参数分析平台

SSM SpringBoot vue智能手机参数分析平台 系统功能 首页 图片轮播 新闻资讯 手机信息 手机百科 登录注册 个人中心 后台管理 登录注册 个人中心 手机百科管理 用户管理 手机对比管理 配置管理 新闻资讯管理 手机信息管理 对比信息管理 我的收藏管理 开发环境和技术 开发语言…

【New Release】PostgreSQL小版本(16.2, 15.6, 14.11, 13.14,12.18) 发布了

前言 PostgreSQL遵循小版本的发布规律&#xff0c;这一个季度的小版本又发布了。可以算作是2024年第一个季度的版本发布。如果总结其规律&#xff1a;大概就是2月、5月、8月、11月的样子。通常因为11月配合大版本的发布&#xff0c;它是起点&#xff0c;也有可能就是终点。起点…

KKVIEW远程控制: 比TODESK好用的软件

比ToDesk更好用的软件&#xff1a;探索远程桌面工具的新选择 在数字化时代&#xff0c;远程桌面工具已经成为许多个人和企业用户不可或缺的一部分。这类工具使得用户可以从一个设备远程控制另一个设备&#xff0c;无论它们相隔多远。其中&#xff0c;ToDesk是一款广受欢迎的远…

微信小程序--开启下拉刷新页面

1、下拉刷新获取数据enablePullDownRefresh 开启下拉刷新&#xff1a; enablePullDownRefreshbooleanfalse是否开启当前页面下拉刷新 案例&#xff1a; 下拉刷新&#xff0c;获取新的列表数据,其实就是进行一次新的网络请求&#xff1a; 第一步&#xff1a;在.json文件中开…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:ListItem)

用来展示列表具体item&#xff0c;必须配合List来使用。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。该组件的父组件只能是List或者ListItemGroup。 子组件 可以包含单个子组件。 接口 从API…

Elasticsearch:从 Java High Level Rest Client 切换到新的 Java API Client

作者&#xff1a;David Pilato 我经常在讨论中看到与 Java API 客户端使用相关的问题。 为此&#xff0c;我在 2019 年启动了一个 GitHub 存储库&#xff0c;以提供一些实际有效的代码示例并回答社区提出的问题。 从那时起&#xff0c;高级 Rest 客户端 (High Level Rest Clie…

一个能够自我游戏的贪吃蛇(pygame与搜索算法)

贪吃蛇小游戏再经典不过了&#xff0c;作为编程爱好者&#xff0c;代码编译的贪吃蛇&#xff0c;又能有怎样的成绩呢&#xff1f; 带着好奇&#xff0c;开始&#xff01; 先做一个普通的贪吃蛇游戏 引入相关package import pygame 定义相关配置变量 # 定义字体 font pyg…