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 ...
随机推荐
- Vue的响应系统
随着 Vue 3.0 Pre Alpha 版本的公布,我们得以一窥其源码的实现.Vue 最巧妙的特性之一是其响应式系统,而我们也能够在仓库的 packages/reactivity 模块下找到对应的实 ...
- jquery的offset().top与javascript的offsetTop区别?
offset().top是jquery的方法,需引入jquery,它获取你绑定元素上边框相对于html上边界的偏移量 offsetTop是原生js的方法,它获取你绑定元素上边框相对于离自己最近且pos ...
- linux centos系统安装
1.下载镜像 https://www.centos.org/download/ DVD ISO 一般下载这个 erverything ISO 包含所有工具的版本 Minimal ISO最小启动版本 2 ...
- 创建全文索引----SQLserver
1.启动 Microsoft Search 服务 开始菜单-->SQL程序组-->服务管理器-->下拉筐-->Microsoft Search 服务-->启动它. 2. ...
- Java读取利用java.util类Properties读取resource下的properties属性文件
说明:upload.properties属性文件在resources下 import java.io.IOException;import java.io.InputStream;import jav ...
- JAVA核心技术--继承(1)
1.继承:向上追溯,对同一批类的抽象,延续和扩展父类的一切信息! 1)关键字:extends 例如,父类是Animal,子类是Dog; eg: public class Dog exte ...
- springboot启动出错,
ssm框架 启动后报错 内容如下 [RMI TCP Connection(2)-127.0.0.1] WARN org.springframework.boot.context.embedded.An ...
- Linux搭建局域网yum源和后期在yum源中更新rpm包方法
在内网中搭建自己的yum源,可以方便在内网中使用,下面简单介绍搭建局域网yum源的方法和后期更新yum源rpm包的方法. 一.搭建局域网yum源 1.需要在局域网访问,首先需要一个web服务器,比如a ...
- 《Maven 实战》笔记之setting.xml介绍
maven是什么?有什么用? Maven是一个跨平台的项目管理工具,主要服务于Java平台的项目构建,依赖管理和项目信息管理.项目构建包括创建项目框架.清理.编译.测试.到生成报告,再到打包和部署,项 ...
- html 中 图片和文字一行 垂直居中对齐
效果: 代码:<div><img src='img/point_icon.png' width='35px' height='35px' style='float: lef ...