Trie:字典树
简介
\(Trie\),又称字典树或前缀树,是一种有序树状的数据结构,用于保存关联数组,其中的键值通常是字符串。
作用
把许多字符串做成一个字符串集合,并可以对其进行快速查找(本文以求多少个单词是一个句子的前缀为例)。
实现
\(Trie\)是一个有根树,它必有一个根节点(我们可以把根节点记作\(0\)),每一条边都有一个字符权值(也可以取这个字符的\(ID\)来当做权值),而节点上存储的则是该节点的单词数目。
我们可以用\(son[i][j]\)来表示第\(i\)个节点编号为\(j\)的儿子,并用\(w[i]\)存储第\(i\)个节点的单词数目,这样就可以构造出一个\(Trie\)了。
构造一个\(Trie\)的时间复杂度是\(O(∑字符串长度)\),询问时间则为\(O(最大字符串长度)\),不过在实际情况中,复杂度也可能会有所减少。
可以说,\(Trie\)的效率是比较高的。
模板
//题意:输入一个数n,随后读入n个单词s[1]...s[n],然后读入一个数m,随后读入m个句子t[1]...t[m],对于每一个句子t[i],求出有多少个单词是它的前缀
//本代码默认只有小写字母
#include<bits/stdc++.h>
#define N 1000//字符串最大个数
#define L 100//字符串最大长度
#define C 26//字符总数
using namespace std;
int n,m;
struct Trie
{
int len,son[N*L+5][C],w[N*L+5];//len存储的节点个数,son[]数组用于储存每个节点的子节点,w[]数组存储每个节点的单词数目
int getID(char x) {return x-'a';}//获取这个字符的ID
void Insert(string s) //将字符串s插入Trie
{
int Now=0;
for(int i=0;i<s.length();i++)
{
if(son[Now][getID(s[i])]==0) son[Now][getID(s[i])]=++len;//若当前字符没出现过,就将其加入当前节点的子节点
Now=son[Now][getID(s[i])];//继续往下进行操作
}
w[Now]++;//最终的Now就是单词节点,将这个节点单词数加1
}
int get_pre(string s)//查找字符串s的前缀个数
{
int Now=0,res=0;//res统计结果
for(int i=0;i<s.length();i++)
{
res+=w[Now];//加上当前节点的单词数
if(son[Now][getID(s[i])]!=0) Now=son[Now][getID(s[i])];//继续往下进行操作
else return res;//若当前字符不是当前节点的子节点,就返回结果
}
return res+w[Now];
}
}t;
int main()
{
string x;
scanf("%d",&n);
for(int i=1;i<=n;i++) cin>>x,t.Insert(x);
scanf("%d",&m);
for(int i=1;i<=m;i++) cin>>x,printf("%d\n",t.get_pre(x));
return 0;
}
Trie:字典树的更多相关文章
- 萌新笔记——C++里创建 Trie字典树(中文词典)(一)(插入、遍历)
萌新做词典第一篇,做得不好,还请指正,谢谢大佬! 写了一个词典,用到了Trie字典树. 写这个词典的目的,一个是为了压缩一些数据,另一个是为了尝试搜索提示,就像在谷歌搜索的时候,打出某个关键字,会提示 ...
- Trie字典树 动态内存
Trie字典树 #include "stdio.h" #include "iostream" #include "malloc.h" #in ...
- 算法导论:Trie字典树
1. 概述 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. Trie一词来自retrieve,发音为/tr ...
- 标准Trie字典树学习二:Java实现方式之一
特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! 系列文章: 1. 标准Trie字典树学习一:原理解析 2.标准T ...
- 817E. Choosing The Commander trie字典树
LINK 题意:现有3种操作 加入一个值,删除一个值,询问pi^x<k的个数 思路:很像以前lightoj上写过的01异或的字典树,用字典树维护数求异或值即可 /** @Date : 2017- ...
- C++里创建 Trie字典树(中文词典)(一)(插入、遍历)
萌新做词典第一篇,做得不好,还请指正,谢谢大佬! 写了一个词典,用到了Trie字典树. 写这个词典的目的,一个是为了压缩一些数据,另一个是为了尝试搜索提示,就像在谷歌搜索的时候,打出某个关键字,会提示 ...
- 数据结构 -- Trie字典树
简介 字典树:又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种. 优点:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高. 性质: 1. 根节 ...
- 踹树(Trie 字典树)
Trie 字典树 ~~ 比 KMP 简单多了,无脑子选手学不会KMP,不会结论题~~ 自己懒得造图了OI WIKI 真棒 字典树大概长这么个亚子 呕吼真棒 就是将读进去的字符串根据当前的字符是什么和所 ...
- trie字典树详解及应用
原文链接 http://www.cnblogs.com/freewater/archive/2012/09/11/2680480.html Trie树详解及其应用 一.知识简介 ...
- Trie字典树 静态内存
静态字典树 看了好久的字典树,挺简单的一个结构,愣是看了这么久才写出来... 专心一点就不会这样了.... 接下来就去刷刷字典树的题吧....... 下面是字典树.... 定义节点 typedef s ...
随机推荐
- java解析xml文件练习——通过应用包名获取应用图标即其他信息(基于魅族应用商店)
1.解析包名数据文件(txt文件),并生成包名数组: package jsouphtml; import java.io.BufferedReader; import java.io.File; im ...
- Python中的矩阵、多维数组:Numpy
Numpy 是Python中科学计算的核心库.它提供一个高性能多维数据对象,以及操作这个对象的工具.部分功能如下: ndarray, 具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组. 用于对 ...
- bzoj2724: [Violet 6]蒲公英(分块)
传送门 md调了一个晚上最后发现竟然是空间开小了……明明算出来够的…… 讲真其实我以前不太瞧得起分块,觉得这种基于暴力的数据结构一点美感都没有.然而今天做了这道分块的题才发现分块的暴力之美(如果我空间 ...
- Mysql-4-数据库的基本操作
1.创建数据库 create database database_name; 例:create database aa; show create database aa;(查看database aa) ...
- 分层图最短路【bzoj2763】: [JLOI2011]飞行路线
bzoj2763: [JLOI2011]飞行路线 Description Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0 ...
- ThreadFactory 线程池工厂
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Thr ...
- Microsoft JDBC Driver 使用 getParameterMetaData 会报错?
不知道为何使用 Microsoft JDBC Driver for SQL Server 驱动时,sql语句不带参数没有问题,但是如果带参数且使用 getParameterMetaData 就会提示某 ...
- Unity www动态加载网上图片
一. 1.新建一个UGUI的Button,删掉它的Image组件,添加一个Raw Image组件.如图: 由于删除了Image组件,所以画圈的位置是空的,运行后会自动把Raw Image添加到那里. ...
- MapReduce的输出格式
1. OutputFormat接口 OutputFormat为输出格式接口,主要用于描述输出数据的格式,它能将输出的键值对写入特定格式的文件中.输出格式的层次结构如下 2. 文本输出 Hadoop默认 ...
- java与模式读后总结
一 老规则边看边写书上的代码,磨磨蹭蹭三个多星期终于把一本1000+的java与模式看完了. 于是,在这里贴上自己对每个模式的思考和总结,其实这个东西在我边看边写的时候已经写了一大半,博文再写一次算是 ...