Trie

Trie,又经常叫前缀树,字典树等等。

Trie,又称前缀树或字典树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,根节点不保存值,这样可以把几个开头不同的串连在一颗Trie上(如abc,efg)。Trie中的键通常是字符串(所以常叫字典树)。

优点
可以最大限度地减少无谓的字符串比较,故可以用于词频统计和大量字符串排序。

缺点
虽然不同单词共享前缀,但其实trie是一个以空间换时间的算法。其每一个字符都可能包含至多字符集大小数目的指针。

建树
两种建法:
(1) 多叉树:仅字母:26或52,各种字母,数字,符号组合:根据情况算吧,反正需要的空间贼大
(2) 兄弟儿子表示法:用链表,如链式前向星(个人比较喜欢),遍历时间较上一种长

应用
(1)字符串检索
(2)用多叉树建的树可以实现字典序排序
(3)最长公共前缀
(4)AC自动机等会用到

促使我学习Trie的题目:UVA 11732 "strcmp()" Anyone?

并没有UVA链接,其他OJ大概也搜得到

这道题给出一个 strcmp() 函数的实现方式,我们要求的就是判断 ‘==’ 的次数

  1. int strcmp(char *s, char *t)
  2. {
  3. int i;
  4. for (i = ; s[i] == t[i]; i++)
  5. if (s[i] == ) return ;
  6. return s[i] - t[i];
  7. }

题面

由于要比较最后的 0,那么字符串相等则答案加 2 * strlen(str) + 2,否则加 2 * ptr + 1,ptr为中断位置。

代码
我使用的是兄弟儿子表示法(很显然),时间复杂度的话,不是很慢,还行吧 . . .

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #define CL(X,N) memset((X), (N), sizeof(X))
  5. using namespace std;
  6. typedef long long LL;
  7. const int maxl = 1e3 + , maxn = 4e3 + ;
  8. int n;
  9. char str[maxl];
  10. int son[maxn * maxl], bro[maxn * maxl], cnt[maxn * maxl];
  11. char trie[maxn * maxl];
  12. LL size = , ans = ;
  13.  
  14. inline void Insert(char *s, int len) {
  15. int ptr, cur = ;
  16. for(int i = ; i <= len; ++i) {
  17. for(ptr = son[cur]; ptr; ptr = bro[ptr])
  18. if(trie[ptr] == s[i]) break;
  19. if(!ptr) {
  20. ptr = size++;
  21. trie[ptr] = s[i];
  22. bro[ptr] = son[cur];
  23. son[cur] = ptr;
  24. cnt[ptr] = ;
  25. son[ptr] = ;
  26. }
  27. ans += (cnt[cur] - cnt[ptr]) * ( * i + );
  28. if(i == len) {
  29. ans += cnt[ptr] * ( * i + );
  30. ++cnt[ptr];
  31. }
  32. ++cnt[cur];
  33. cur = ptr;
  34. }
  35. return ;
  36. }
  37.  
  38. inline void Initialize(void) {
  39. son[] = bro[] = cnt[] = ;
  40. ans = ;
  41. size = ;
  42. return ;
  43. }
  44.  
  45. int main(int argc, char **argv) {
  46. #ifdef LOCAL
  47. freopen("in.txt", "r", stdin);
  48. #endif
  49. int len, cas = ;
  50. while(~scanf("%d", &n) && n) {
  51. Initialize();
  52. for(int i = ; i < n; ++i) {
  53. scanf("%s", str);
  54. len = strlen(str);
  55. Insert(str, len);
  56. }
  57. printf("Case %d: %lld", ++cas, ans);
  58. putchar();
  59. }
  60. return ;
  61. }

Trie(字典树,前缀树)_模板的更多相关文章

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

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

  2. [LeetCode] Implement Trie (Prefix Tree) 实现字典树(前缀树)

    Implement a trie with insert, search, and startsWith methods. Note:You may assume that all inputs ar ...

  3. [LeetCode] 208. Implement Trie (Prefix Tree) 实现字典树(前缀树)

    Implement a trie with insert, search, and startsWith methods. Example: Trie trie = new Trie(); trie. ...

  4. 内存空间有限情况下的词频统计 Trie树 前缀树

    数据结构与算法专题--第十二题 Trie树 https://mp.weixin.qq.com/s/nndr2AcECuUatXrxd3MgCg

  5. Trie - leetcode [字典树/前缀树]

    208. Implement Trie (Prefix Tree) 字母的字典树每个节点要定义一个大小为26的子节点指针数组,然后用一个标志符用来记录到当前位置为止是否为一个词,初始化的时候讲26个子 ...

  6. LeetCode OJ:Implement Trie (Prefix Tree)(实现一个字典树(前缀树))

    Implement a trie with insert, search, and startsWith methods. 实现字典树,前面好像有道题做过类似的东西,代码如下: class TrieN ...

  7. HDU 1251 字典树(前缀树)

    题目大意 :Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).(单词互不相同) ...

  8. TRIE 字典树 前缀紧急集合!

    TRIE: 在计算机科学中,Trie,又称前缀树或字典树,是一种有序树状的数据结构,用于保存关联数组,其中的键通常是字符串.——百度百科 自我理解: trie树,是一种处理字符串前缀的数据结构,通常会 ...

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

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

随机推荐

  1. XUtils3 的 环境搭建与简单使用

    XUtils3 的 环境搭建 环境搭建三部曲 ----------------------- 说明 : author  修雨轩陈 使用andorid Studio 已经创建了一个项目 并且自己需要使用 ...

  2. PopupWindow简单使用

    如图是效果图 当点击 “点我”的按钮是   会弹出 如图的 弹窗 补充为PopupWindow设置一个显示动画和消失的动画 先在anim的文件下分别设置显示和消失的动画 <?xml versio ...

  3. 2017年Nature文章“Millions of online book co-purchases reveal partisan differences in the consumption of science”阅读笔记

    论文:      Millions of online book co-purchases reveal partisan differences in the consumption of scie ...

  4. Java—集合框架Set

    Set接口及其实现类——HashSet Set是元素无序并且不可以重复的集合,被称作集. HashSet—哈希集,是Set的一个重要实现类. Set的使用   HashSet没有像List一样的set ...

  5. sqlserver ceiling函数用法

    ceiling函数返回大于或等于所给数字表达式的最小整数. floor函数返回小于或等于所给数字表达式的最大整数. eg: select ceiling(4.42) ---5select CEILIN ...

  6. SQL-MySQL使用教程-对MySQL的初步尝试

    出现问题:中文无法显示.存储:不对任何数据做检测,只管理数据类型.

  7. HDU 1853 MCMF

    题意:给定一个有向带权图,使得每一个点都在一个环上,而且权之和最小. 分析:每个点在一个环上,入度 = 出度 = 1,拆点入点,出点,s到所有入点全部满载的最小费用MCMF; #include < ...

  8. 论文翻译:XNOR-Net: ImageNet Classification Using BinaryConvolutional Neural Networks

    目录 Abstract 1 Introduction 2 Related Work 3 Binary Convolutional Neural Network 3.1 Binary-Weight-Ne ...

  9. 原生ajax接收json字符串(简单介绍)

    什么是json? JSON的全称是 Javascript Object Notation(javascript对象表示法),是基于javascript对象字面量,如果单从眼睛看,JSON里的数据是被保 ...

  10. 【luogu P2746 [USACO5.3]校园网Network of Schools】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2812 注意:判断出入度是否为0的时候枚举只需到颜色的数量. 坑点:当只有一个强连通分量时,不需要再添加新边. ...