Tire(字典树)
Tire
字典树,又称为单词查找树,Tire 树,是一种树形结构,它是哈希树的变种。
实现原理:
字典树与字典很相似,当要查一个单词是不是在字典树中,首先看单词的第一个字母是不是在字典的第一层,如果不在,说明字典树里没有该单词,如果在就在该字母的孩子节点里找是不是有单词的第二个字母,没有说明没有该单词,有的话用同样的方法继续查找,以此类推。
此算法的核心思想是以空间换时间,利用字符串的公共前缀来减少无谓的字符串比较以达到提高查询效率的目的,其查找的时间复杂度是O(1)。
性质:
1、根节点不包含字符,除根节点以外每个节点只包含一个字符。
2、从根节点到某一个节点,路径i上经过的字符连接起来,为该节点对应的字符串。
3、每个节点的所用子节点包含的字符串不相同。
建树和查询:
1、建树:建树的话,比较简短,就是每个结点有26个子节点,对应的就是26个小写字母,然后依次遍历这个字符串,就能建立一个树,有一个地方要注意的就是这最后一个结点那里,需要标记一下,证明这个是某一个字符串的结尾。
2、查询:查询的话,就更为简单了,就是从根节点依次往下查询,对应的字符是否为空,为空的话,就证明这个字符串在树中不存在,否则,就继续遍历下取,等字符串全部遍历完后,就判断当前指针所指向的位置是否有结束标志,有的话,便是该字符串存在,否则便是不存在。
附上一个水题理解一下代码怎么敲:
统计难题
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others)
Total Submission(s): 66368 Accepted Submission(s): 22892
注意:本题只有一组测试数据,处理到文件结束.
band
bee
absolute
acm
ba
b
band
abc
3
1
0
#include <iostream>
#include <cstdio> using namespace std; int tire[][];
int sum[];
int tot = ; //此处可以理解为层次,就是想当于,每一层数组表示一个指针 void insert(string str) {
int root = ;
int len = str.size();
for(int i = ; i < len; i++) {
int idx = str[i] - 'a';
if(tire[root][idx] == ) {
tire[root][idx] = ++tot;
}
root = tire[root][idx];
sum[root]++;
}
} int query(string str) {
int len = str.size();
int root = ;
for(int i = ; i < len; i++) {
int idx = str[i] - 'a';
if(tire[root][idx] == ) {
return ;
}
root = tire[root][idx];
}
return sum[root];
} int main() {
string str;
while(getline(cin, str)) {
if(str == "") {
break;
}
insert(str);
}
while(cin >> str) {
cout << query(str) << endl;
}
return ;
}
Tire(字典树)的更多相关文章
- The XOR Largest Pair(Tire字典树应用)
题目链接:传送门 思路:建立一个32位的字典树,对每一个要插入的数字查找它异或的最大值(就是尽量全部二进制的值都相反), 然后获得两个数异或的最大值. #include<iostream> ...
- 洛谷1258 Tire字典树
直接上代码: #include<bits/stdc++.h> using namespace std; typedef unsigned int ui; typedef long long ...
- [数据结构]字典树(Tire树)
概述: Trie是个简单但实用的数据结构,是一种树形结构,是一种哈希树的变种,相邻节点间的边代表一个字符,这样树的每条分支代表一则子串,而树的叶节点则代表完整的字符串.和普通树不同的地方是,相同的字符 ...
- 海量数据处理之Tire树(字典树)
参考博文:http://blog.csdn.net/v_july_v/article/details/6897097 第一部分.Trie树 1.1.什么是Trie树 Trie树,即字典树,又称单词查找 ...
- Tire树(字典树)
from:https://www.cnblogs.com/justinh/p/7716421.html Trie,又经常叫前缀树,字典树等等.它有很多变种,如后缀树,Radix Tree/Trie,P ...
- Hihicoder 题目1 : Trie树(字典树,经典题)
题目1 : Trie树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编 ...
- poj 2503:Babelfish(字典树,经典题,字典翻译)
Babelfish Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 30816 Accepted: 13283 Descr ...
- poj 2001:Shortest Prefixes(字典树,经典题,求最短唯一前缀)
Shortest Prefixes Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 12731 Accepted: 544 ...
- hdu 1247:Hat’s Words(字典树,经典题)
Hat’s Words Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
随机推荐
- Amoeba 实现MySQL读写分离
Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy,它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行.基于此可以实现负载均衡. ...
- sql server 函数详解(5)系统函数
返回表中指定字段的长度 返回表中指定字段的名称 返回数据表达式的数据的实际长度函数 返回数据库的编号 返回数据库的名称 返回数据库当前默认的null值 返回服务器端计算机的标识号 返回服务 ...
- Linq Distinct 自定义比较
private class MyMenuComparer : IEqualityComparer { public bool Equals(ParMenu x, ParMenu y){ return ...
- springboot的一些注解
springboot注解以及一些晦涩难理解的点介绍 @Validated 用于注入数值校验的注解(JSR303数据校验) @PropertySource 用于加载指定的配置文件,例如@Property ...
- 【Activiti】crm与工作流的整合,一个完整的流程实例创建到任务完成的过程
1.建立任务列表页面--根据用户的nickName作为assignee查询其所拥有的任务列表 2.在任务后添加办理按钮 3.点击办理按钮,出现流程办理框,其中详细显示了该任务的相关详细信息,本实例中为 ...
- QT textbroswer textedite Qlist的常用的操作函数
Textbrowser: 一.添加函数 1.insertPlainText():这个函数特别好用,括号里面的参数是QString,可以用QString(“%1%2”).arg(QString变量).a ...
- 个人作业4-ALpha项目测试
这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1/ 这个作业要求在哪里 https://edu.cnbl ...
- TP5 中的redis 队列
首先我们看一下自己的TP5的框架中的 TP5\vendor\topthink ,这个文件中有没有think-queue这个文件夹,如果没有请安装, 安装这个是要用到Composer的如果没有安装co ...
- Java 实现《编译原理》中间代码生成 -逆波兰式生成与计算 - 程序解析
Java 实现<编译原理>中间代码生成 -逆波兰式生成与计算 - 程序解析 编译原理学习笔记 (一)逆波兰式是什么? 逆波兰式(Reverse Polish notation,RPN,或逆 ...
- node.js启动服务,不依赖第三方
好好学习,天天向上,懒惰.颓废让我越来越糟糕,所以分享一下,共同学习 纯node.js搭建一个小服务,下图为文件目录结构,很简单,很小 log文件是自动生成的 index.js文件 const url ...