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

Problem Description
Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
 
Input
输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.

注意:本题只有一组测试数据,处理到文件结束.

 
Output
对于每个提问,给出以该字符串为前缀的单词的数量.
 
Sample Input
banana
band
bee
absolute
acm

ba
b
band
abc

 
Sample Output
2
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(字典树)的更多相关文章

  1. The XOR Largest Pair(Tire字典树应用)

    题目链接:传送门 思路:建立一个32位的字典树,对每一个要插入的数字查找它异或的最大值(就是尽量全部二进制的值都相反), 然后获得两个数异或的最大值. #include<iostream> ...

  2. 洛谷1258 Tire字典树

    直接上代码: #include<bits/stdc++.h> using namespace std; typedef unsigned int ui; typedef long long ...

  3. [数据结构]字典树(Tire树)

    概述: Trie是个简单但实用的数据结构,是一种树形结构,是一种哈希树的变种,相邻节点间的边代表一个字符,这样树的每条分支代表一则子串,而树的叶节点则代表完整的字符串.和普通树不同的地方是,相同的字符 ...

  4. 海量数据处理之Tire树(字典树)

    参考博文:http://blog.csdn.net/v_july_v/article/details/6897097 第一部分.Trie树 1.1.什么是Trie树 Trie树,即字典树,又称单词查找 ...

  5. Tire树(字典树)

    from:https://www.cnblogs.com/justinh/p/7716421.html Trie,又经常叫前缀树,字典树等等.它有很多变种,如后缀树,Radix Tree/Trie,P ...

  6. Hihicoder 题目1 : Trie树(字典树,经典题)

    题目1 : Trie树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编 ...

  7. poj 2503:Babelfish(字典树,经典题,字典翻译)

    Babelfish Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 30816   Accepted: 13283 Descr ...

  8. poj 2001:Shortest Prefixes(字典树,经典题,求最短唯一前缀)

    Shortest Prefixes Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 12731   Accepted: 544 ...

  9. hdu 1247:Hat’s Words(字典树,经典题)

    Hat’s Words Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

随机推荐

  1. (电脑重置之后)win10在桌面点右键鼠标一直转圈;无法点击桌面图标;

    昨天重置系统之后,发现了这个毛病.桌面任务栏都能正常点击,就是一到桌面,无法点击桌面上面的图标(刚开机的时候还可以点).想新建文件夹来着,一点右键,鼠标即开始转圈圈.本来以为自己能好,结果第二天了还这 ...

  2. # 关于设置AUTH_USER_MODEL出现的问题

    关于设置AUTH_USER_MODEL出现的问题 在运行的时候出现了一个bug: AttributeError: type object 'UserProfile' has no attribute ...

  3. TCP 三次握手和四次挥手

    TCP 三次握手和四次挥手 作为面试会被经常考察的的点,自己复习了一下,总结如下: TCP 三次握手 先上图: 所谓三次握手,是指建立一个 TCP 连接时,需要客户端和服务器总共发送 3 个包. 第一 ...

  4. shiro配置学习

    一.shiro的配置 1.shiro的web过滤 实例化ShiroFilterFactoryBean 设置securityManager.loginUrl.unauthorizedUrl.sucess ...

  5. execjs执行js代码报错:Exception in thread Thread-1

    最近在爬一个js数据加密的网站的时候,出了点问题,困扰了我两天 直接运行js文件的时候正常,但是用execjs运行js代码的时候总是会报错 最后翻了很多博客之后,终于找到了原因:原因是有一个程序在使用 ...

  6. luogu P3826 [NOI2017]蔬菜

    luogu 那个第一次购买有\(s_i\)奖励,可以看成是多一种蔬菜\(i+n\),权值为\(w_i+s_i\),每天减少量\(x\)为0个,保质期\(\lceil\frac{c_i}{x_i}\rc ...

  7. java实现spark常用算子之intersection

    import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaRDD;import org.apache.spark.a ...

  8. 教你用python爬取网站美女图(附代码及教程)

    我前几篇文章都是说一些python爬虫库的用法,还没有说怎样利用好这些知识玩一些好玩的东西.那我今天带大家玩好玩又刺激的,嘻嘻!对了,requests库和正则表达式很重要的,一定要学会!一定要学会!! ...

  9. echarts图表数据信息动态获取

    第一步准备一个json文件echarts.json(名字无所谓),用来模拟从后台获取数据 { "name":["直达","营销广告",&qu ...

  10. aiomysql实现对数据库异步读取

    有一个库叫做aiomysql,这是一个基于asyncio和pymysql的库.至于为什么可以在tornado中使用,是因为高版本tornado的底层使用了asyncio. import asyncio ...