数据结构~trie树(字典树)
1、概述
Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树。
我理解字典树是看了这位大佬博客。还不了解字典树的可以先进去学习一下
https://www.cnblogs.com/TheRoadToTheGold/p/6290732.html
还有这个讲了下为什么用字典树,和其他的相比优缺点在哪
https://www.cnblogs.com/Allen-rg/p/7128518.html
现在来个题来更进一步了解字典树吧 ,嘻嘻-_-
Input
Output
Sample Input
dog ogday
cat atcay
pig igpay
froot ootfray
loops oopslay atcay
ittenkay
oopslay
Sample Output
cat
eh
loops
Hint
#include<cstdio>
#include<cstring>
using namespace std;
int top=;
int a[][];
int sum[];
void insert(char str[])
{
int root=;
for(int i=;str[i]!='\0';i++)
{
int x=str[i]-'a';
if(!a[root][x])
{
a[root][x]=++top;
}
sum[a[root][x]]++;
root=a[root][x];
}
}
int find(char str[])
{
int root=;
for(int i=;str[i]!='\0';i++)
{
int x=str[i]-'a';
if(!a[root][x]) return ;
root=a[root][x];
}
return sum[root];
}
int main()
{
char str[];
while(gets(str)!=NULL)
{
if(strlen(str)==)
break;
insert(str);
}
while(gets(str)!=NULL)
{
printf("%d\n",find(str));
}
}
解释:字典树的一些编号什么的解释在上两篇博客中都有讲到,我这里就不再解释,在以上代码中,我们是使用a数组存放字典树,sum数组存放了每个点节点的时候的儿子数量,也就是以这个节点下的大分支的数量个数,这样的话,sum的功能我们就能理解啦,就是sum[k] ,以1编号到k编号的这个字符串,sum[k]存放的就是这个字符串的一些东西,以上代码中我们存的是儿子数,所以就是以这个字符串为前缀的数量,这里我们就能想到这个sum数组不止可以存放前缀儿子数,下面讲另外一个应用,也就是上面这个题
思路:之前我们sum数组我们存的是到这个编号为止的字符串的儿子数,而这个题是说到一个字符串到另外一个字符串的映射,我们就可以想到,一个是一个字符串对应一个整数,一个是一个字符串对应一个字符串,我们是不是只要把那个sum[k]的整数换成字符串就可以了呢,答案是肯定的,当然我这里是预先把那些字符串存了下来,然后sum[k]存的是对应于那个字符串数组的一个编号,下面看代码
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<string>
#include<map>
#include<algorithm>
using namespace std;
typedef long long ll;
int n,m,top=;
int sum[];
char str[],s[];
char c[][];
char dic[][];
void insert(char str[],int cnt)
{
int root=;
for(int i=;str[i]!='\0';i++)
{
int x=str[i]-'a';
if(!c[root][x]) c[root][x]=++top;
root=c[root][x];
}
sum[root]=cnt;
}
int find(char str[])
{
int root=;
for(int i=;str[i]!='\0';i++)
{
int x=str[i]-'a';
if(!c[root][x]) return ;
root=c[root][x];
}
return sum[root];
}
int main()
{
int cnt=;
while(gets(str)!=NULL)
{
if(strlen(str)==) break;
sscanf(str,"%s %s",dic[cnt++],s);
insert(s,cnt-);
}
while(gets(str)!=NULL)
{
int x=find(str);
if(x==) printf("eh\n");
else printf("%s\n",dic[x]);
}
}
字典树可能还有好多骚操作没学,以后学了之后再更新,23333,^_^
数据结构~trie树(字典树)的更多相关文章
- 剑指Offer——Trie树(字典树)
剑指Offer--Trie树(字典树) Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种的单词.对于每一个单词,我们要判断他出没出现过,如果出现了,求第一次出现在第几个位 ...
- 9-11-Trie树/字典树/前缀树-查找-第9章-《数据结构》课本源码-严蔚敏吴伟民版
课本源码部分 第9章 查找 - Trie树/字典树/前缀树(键树) ——<数据结构>-严蔚敏.吴伟民版 源码使用说明 链接☛☛☛ <数据结构-C语言版>(严蔚 ...
- AC自动机——1 Trie树(字典树)介绍
AC自动机——1 Trie树(字典树)介绍 2013年10月15日 23:56:45 阅读数:2375 之前,我们介绍了Kmp算法,其实,他就是一种单模式匹配.当要检查一篇文章中是否有某些敏感词,这其 ...
- Trie(字典树)
没时间整理了,老吕又讲课了@ @ 概念 Trie即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种,典型应用是统计和排序大量的字符串(不限于字符串) Trie字典树主要用于存储字符串, ...
- Trie树|字典树(字符串排序)
有时,我们会碰到对字符串的排序,若采用一些经典的排序算法,则时间复杂度一般为O(n*lgn),但若采用Trie树,则时间复杂度仅为O(n). Trie树又名字典树,从字面意思即可理解,这种树的结构像英 ...
- Trie树 - 字典树
1.1.什么是Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是最大限 ...
- Trie(前缀树/字典树)及其应用
Trie,又经常叫前缀树,字典树等等.它有很多变种,如后缀树,Radix Tree/Trie,PATRICIA tree,以及bitwise版本的crit-bit tree.当然很多名字的意义其实有交 ...
- Trie:字典树
简介 \(Trie\),又称字典树或前缀树,是一种有序树状的数据结构,用于保存关联数组,其中的键值通常是字符串. 作用 把许多字符串做成一个字符串集合,并可以对其进行快速查找(本文以求多少个单词是一个 ...
- Trie 树(字典树)
[动画]看动画轻松理解「Trie树」 读音 Trie这个名字取自“retrieval”,检索,因为Trie可以只用一个前缀便可以在一部字典中找到想要的单词. 虽然发音与「Tree」一致,但为了将这种 ...
- trie(字典树)原理及C++代码实现
字典树,又称前缀树,是用于存储大量字符串或类似数据的数据结构. 它的原理是利用相同前缀来减少查询字符串的时间. 不同于BST把关键字保存在本结点中,TRIE可以想象成把关键字和下一个结点的指针绑定,事 ...
随机推荐
- LeetCode--405--数字转化为十六进制数
问题描述: 给定一个整数,编写一个算法将这个数转换为十六进制数.对于负整数,我们通常使用 补码运算 方法. 注意: 十六进制中所有字母(a-f)都必须是小写. 十六进制字符串中不能包含多余的前导零.如 ...
- 20170906xlVBA_RecursionGetFiles
Dim Dic As Object Sub GetFileName() Dim FolderPath As String Set Dic = CreateObject("Scripting. ...
- 终于可以从百度云上BOS读取数据到本地了
终于可以从百度云上BOS读取数据到本地了
- 『TensorFlow』生成式网络中的图片预处理
简介 这里的生成式网络是广义的生成式,不仅仅指gan网络,还有风格迁移中的类自编码器网络,以及语义分割中的类自编码器网络,因为遇到次数比较多,所以简单的记录一下. 背景 1.像素和数字 图像处理目标一 ...
- HDU - 4456 cdq
题意:给一个矩阵,两种操作1:修改单点的权值,2:查询和某个点曼哈顿距离小于r点的权值和 题解:先旋转坐标轴,(x,y)->(x-y,x+y)然后就变成了cdq分治裸题,子矩阵和和单点修改一维时 ...
- Shiro中Realm
6.1 Realm [2.5 Realm]及[3.5 Authorizer]部分都已经详细介绍过Realm了,接下来再来看一下一般真实环境下的Realm如何实现. 1.定义实体及关系 即用户-角色 ...
- readline与readlines之间的简单区别
首先来探望一下readline这位女同志: 偷窥一下user.txt内容: user password buqiuen 123456 xietingfeng 123456 一.readline例子: ...
- atoi函数原型
一.atoi()函数的功能: 1.定义: 将字符串转换成整型数,跳过前面的空格字符,直到遇上数字或正负号才开始做转换,而再遇到非数字或字符串时('\0')结束转化,并将结果返回(返回转换后的整型数). ...
- js时间与时间戳互相转换
var _time1 = Date.parse(new Date(‘2017-05-02 00:00:00’))/1000; //将设定的日期转换为时间戳 _time1 = getLocalTime( ...
- Java环境下shiro的测试-认证与授权
Java环境下shiro的测试 1.导入依赖的核心jar包 <dependency> <groupId>org.apache.shiro</groupId> < ...