1、概述

Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树。

我理解字典树是看了这位大佬博客。还不了解字典树的可以先进去学习一下

https://www.cnblogs.com/TheRoadToTheGold/p/6290732.html

还有这个讲了下为什么用字典树,和其他的相比优缺点在哪

https://www.cnblogs.com/Allen-rg/p/7128518.html

现在来个题来更进一步了解字典树吧 ,嘻嘻-_-

POJ - 2503  Babelfish

You have just moved from Waterloo to a big city. The people here speak an incomprehensible dialect of a foreign language. Fortunately, you have a dictionary to help you understand them.

Input

Input consists of up to 100,000 dictionary entries, followed by a blank line, followed by a message of up to 100,000 words. Each dictionary entry is a line containing an English word, followed by a space and a foreign language word. No foreign word appears more than once in the dictionary. The message is a sequence of words in the foreign language, one word on each line. Each word in the input is a sequence of at most 10 lowercase letters.

Output

Output is the message translated to English, one word per line. Foreign words not in the dictionary should be translated as "eh".

Sample Input

  1. dog ogday
  2. cat atcay
  3. pig igpay
  4. froot ootfray
  5. loops oopslay
  6.  
  7. atcay
  8. ittenkay
  9. oopslay

Sample Output

  1. cat
  2. eh
  3. loops

Hint

Huge input and output,scanf and printf are recommended. 
 
题意:前面有个字典列表,后一个单词映射到前一个,后面有很多次查询,输出单词映射到的那个单词,如果没有输出eh
思路:因为这题数据比较弱,所以用map映射照样可以过,在这里我们当是字典树入门,之前我们用map可以算某个单词映射到哪个单词,这个字典树和map其实
相差不大,但是在求某个前缀的个数的时候,map就要使用多个映射,这个时候字典树的优势就来了
我们可以看下代码
  1. #include<cstdio>
  2. #include<cstring>
  3. using namespace std;
  4. int top=;
  5. int a[][];
  6. int sum[];
  7. void insert(char str[])
  8. {
  9. int root=;
  10. for(int i=;str[i]!='\0';i++)
  11. {
  12. int x=str[i]-'a';
  13. if(!a[root][x])
  14. {
  15. a[root][x]=++top;
  16. }
  17. sum[a[root][x]]++;
  18. root=a[root][x];
  19. }
  20. }
  21. int find(char str[])
  22. {
  23. int root=;
  24. for(int i=;str[i]!='\0';i++)
  25. {
  26. int x=str[i]-'a';
  27. if(!a[root][x]) return ;
  28. root=a[root][x];
  29. }
  30. return sum[root];
  31. }
  32. int main()
  33. {
  34. char str[];
  35. while(gets(str)!=NULL)
  36. {
  37. if(strlen(str)==)
  38. break;
  39. insert(str);
  40. }
  41. while(gets(str)!=NULL)
  42. {
  43. printf("%d\n",find(str));
  44. }
  45. }

解释:字典树的一些编号什么的解释在上两篇博客中都有讲到,我这里就不再解释,在以上代码中,我们是使用a数组存放字典树,sum数组存放了每个点节点的时候的儿子数量,也就是以这个节点下的大分支的数量个数,这样的话,sum的功能我们就能理解啦,就是sum[k]  ,以1编号到k编号的这个字符串,sum[k]存放的就是这个字符串的一些东西,以上代码中我们存的是儿子数,所以就是以这个字符串为前缀的数量,这里我们就能想到这个sum数组不止可以存放前缀儿子数,下面讲另外一个应用,也就是上面这个题

思路:之前我们sum数组我们存的是到这个编号为止的字符串的儿子数,而这个题是说到一个字符串到另外一个字符串的映射,我们就可以想到,一个是一个字符串对应一个整数,一个是一个字符串对应一个字符串,我们是不是只要把那个sum[k]的整数换成字符串就可以了呢,答案是肯定的,当然我这里是预先把那些字符串存了下来,然后sum[k]存的是对应于那个字符串数组的一个编号,下面看代码

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<string>
  6. #include<map>
  7. #include<algorithm>
  8. using namespace std;
  9. typedef long long ll;
  10. int n,m,top=;
  11. int sum[];
  12. char str[],s[];
  13. char c[][];
  14. char dic[][];
  15. void insert(char str[],int cnt)
  16. {
  17. int root=;
  18. for(int i=;str[i]!='\0';i++)
  19. {
  20. int x=str[i]-'a';
  21. if(!c[root][x]) c[root][x]=++top;
  22. root=c[root][x];
  23. }
  24. sum[root]=cnt;
  25. }
  26. int find(char str[])
  27. {
  28. int root=;
  29. for(int i=;str[i]!='\0';i++)
  30. {
  31. int x=str[i]-'a';
  32. if(!c[root][x]) return ;
  33. root=c[root][x];
  34. }
  35. return sum[root];
  36. }
  37. int main()
  38. {
  39. int cnt=;
  40. while(gets(str)!=NULL)
  41. {
  42. if(strlen(str)==) break;
  43. sscanf(str,"%s %s",dic[cnt++],s);
  44. insert(s,cnt-);
  45. }
  46. while(gets(str)!=NULL)
  47. {
  48. int x=find(str);
  49. if(x==) printf("eh\n");
  50. else printf("%s\n",dic[x]);
  51. }
  52. }

字典树可能还有好多骚操作没学,以后学了之后再更新,23333,^_^

数据结构~trie树(字典树)的更多相关文章

  1. 剑指Offer——Trie树(字典树)

    剑指Offer--Trie树(字典树) Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种的单词.对于每一个单词,我们要判断他出没出现过,如果出现了,求第一次出现在第几个位 ...

  2. 9-11-Trie树/字典树/前缀树-查找-第9章-《数据结构》课本源码-严蔚敏吴伟民版

    课本源码部分 第9章  查找 - Trie树/字典树/前缀树(键树) ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版>(严蔚 ...

  3. AC自动机——1 Trie树(字典树)介绍

    AC自动机——1 Trie树(字典树)介绍 2013年10月15日 23:56:45 阅读数:2375 之前,我们介绍了Kmp算法,其实,他就是一种单模式匹配.当要检查一篇文章中是否有某些敏感词,这其 ...

  4. Trie(字典树)

    没时间整理了,老吕又讲课了@ @ 概念 Trie即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种,典型应用是统计和排序大量的字符串(不限于字符串) Trie字典树主要用于存储字符串, ...

  5. Trie树|字典树(字符串排序)

    有时,我们会碰到对字符串的排序,若采用一些经典的排序算法,则时间复杂度一般为O(n*lgn),但若采用Trie树,则时间复杂度仅为O(n). Trie树又名字典树,从字面意思即可理解,这种树的结构像英 ...

  6. Trie树 - 字典树

    1.1.什么是Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是最大限 ...

  7. Trie(前缀树/字典树)及其应用

    Trie,又经常叫前缀树,字典树等等.它有很多变种,如后缀树,Radix Tree/Trie,PATRICIA tree,以及bitwise版本的crit-bit tree.当然很多名字的意义其实有交 ...

  8. Trie:字典树

    简介 \(Trie\),又称字典树或前缀树,是一种有序树状的数据结构,用于保存关联数组,其中的键值通常是字符串. 作用 把许多字符串做成一个字符串集合,并可以对其进行快速查找(本文以求多少个单词是一个 ...

  9. Trie 树(字典树)

    [动画]看动画轻松理解「Trie树」 读音 Trie这个名字取自“retrieval”,检索,因为Trie可以只用一个前缀便可以在一部字典中找到想要的单词. 虽然发音与「Tree」一致,但为了将这种 ...

  10. trie(字典树)原理及C++代码实现

    字典树,又称前缀树,是用于存储大量字符串或类似数据的数据结构. 它的原理是利用相同前缀来减少查询字符串的时间. 不同于BST把关键字保存在本结点中,TRIE可以想象成把关键字和下一个结点的指针绑定,事 ...

随机推荐

  1. Spring Boot之实现自动配置

    GITHUB地址:https://github.com/zhangboqing/springboot-learning 一.Spring Boot自动配置原理 自动配置功能是由@SpringBootA ...

  2. MVC,MVVM,MVP的区别/ Vue中忽略的知识点!

    按照顺序学习: https://scotch.io/courses/build-an-online-shop-with-vue/hello-world Vue Authentication And R ...

  3. P3489 付公主的背包

    题意:n<=1e5,m<=1e5,跑n个物品1到m容量的完全背包. 考虑暴力的做法就是把一些1/(1+x^a)的多项式乘起来即可. 考虑优化,取一下ln,转化为加法,然后exp回去就好了.

  4. python基础之字符串以及切片等操作

    1.字符类型 1.整型 int  2. str 字符串 3.bool 布尔值 4.list 表格,常用于大量数据的存储 用[ ]表示  5.tuple 元祖 ,不能发生改变()表示  6.dict 字 ...

  5. DP 租用游艇

    洛谷P1359租用游艇 分析:这个游艇我看到题目下意识的就想将dp数组设为dp[i][j]表示i到j之间的最短距离,但题目上要求的只是从起点到终点的距离,这样设只是自找麻烦. 直接设成dp[i]表示从 ...

  6. SqlSever查询某个表的列名称、说明、备注、注释,类型等

    这周整理了数据库文档,发现用导出脚本来整理表的信息注释查看不方便,因此我就想能不能SQL语句查询表的注释或者表的字段.我就我问朋友是不是可以,他给我点指导,然后自己也在网上百度,来实现自己的想法,我把 ...

  7. Spring boot(六)优雅使用mybatis

    orm框架的本质是简化编程中操作数据库的编码,发展到现在基本上就剩两家了,一个是宣称可以不用写一句SQL的hibernate,一个是可以灵活调试动态sql的mybatis,两者各有特点,在企业级系统开 ...

  8. WDA基础一:激活相关服务

    一个普通得系统,如果之前没动过相关配置而又想做做WDA程序,是需要激活几个服务的. 1.激活服务 事务码:SICF 默认SERVICE,执行. Service:default_host/sap/opt ...

  9. JedisClusterMaxRedirectionsException: Too many Cluster redirections

    发生环境 当时的redis集群配置:redis-trib.rb 127.0.0.1 .... redis.conf的bind是默认# 解决方案 将redis.conf的bind为局域网真实ip red ...

  10. ubuntu14静态ip配置

    0.配置ip需要掌握的一些基本指令 打开/创建文件      sudo vim ... 插入信息      i 保存并强制退出      先按Esc,再键入:wq!,回车 1.使用命令 sudo vi ...