1. trie基础

(1) 是什么?

Trie,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。

(2) 性质

  • 根节点不包含字符,除根节点外每一个节点都只包含一个字符
  • 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串
  • 每个节点的所有子节点包含的字符都不相同

例如,单词序列a, to, tea, ted, ten, i, in, inn,对应的trie。

(3) 应用

用于统计和排序大量的字符串,但不仅限于字符串,所以经常被搜索引擎系统用于文本词频统计。

(4) 优点

  • 最大限度地减少无谓的字符串比较
  • 查询效率比哈希表高

2. 一个例子

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. #define MAX 256//ascii码有256个字符,故每棵树的子节点最多有256个
  6. #define MAXLEN 256//单词最长为256
  7.  
  8. typedef struct TrieNode
  9. {
  10. int count;
  11. struct TrieNode *next[MAX];
  12. }TrieNode;
  13.  
  14. //插入一个单词
  15. void Insert(char *word,TrieNode *root)
  16.  
  17. {
  18. int i;
  19. TrieNode *cur;
  20. if(word[]=='\0')
  21. return;
  22. cur=root;
  23. for(i=;word[i]!='\0';i++)
  24. {
  25. if(cur->next[word[i]]==NULL)
  26. {
  27. TrieNode *newNode = (TrieNode *)malloc(sizeof(TrieNode));
  28. memset(newNode,,sizeof(TrieNode));
  29. cur->next[word[i]]=newNode;
  30. }
  31. cur=cur->next[word[i]];
  32. }
  33.  
  34. cur->count++;
  35. return;
  36. }
  37.  
  38. //创建树输入每个单词,以回车结束,则单词被插入树中,碰到*停止树的创建
  39. void Construct(TrieNode *&root)
  40. {
  41. char inStr[MAXLEN];
  42. int size=;
  43. root = (TrieNode *)malloc(sizeof(TrieNode));
  44. memset(root,,sizeof(TrieNode));
  45. while()
  46. {
  47. scanf("%s",inStr);
  48. if(strcmp(inStr,"*")==)
  49. break;
  50. Insert(inStr,root);
  51. }
  52. return;
  53. }
  54.  
  55. //遍历整棵树
  56. void Traverse(TrieNode *curP)
  57. {
  58. static char theWord[MAXLEN];
  59. static int pos=;
  60. int i;
  61. if(curP==NULL)
  62. return;
  63. if(curP->count)
  64. {
  65. theWord[pos]='\0';
  66. printf("%s:%d\n",theWord,curP->count);
  67. }
  68. for(i=;i<MAX;i++)
  69. {
  70. theWord[pos++]=i;
  71. //从这句话可以看出在递归调用子节点前,子节点的值已经加入到单词中了
  72. Traverse(curP->next[i]);
  73. pos--;
  74. }
  75. return;
  76. }
  77.  
  78. //查找一个单词是不是在树中
  79. bool Find(TrieNode *root,char *word)
  80. {
  81. int i;
  82. TrieNode *cur;
  83. cur=root;
  84. for(i=;word[i]!='\0';i++)
  85. {
  86. if(cur->next[word[i]]==NULL)
  87. {
  88. return false;
  89. }
  90. cur=cur->next[word[i]];
  91. }
  92.  
  93. if(cur->count)
  94. return true;
  95. else
  96. return false;
  97. } /* 何问起 hovertree.com */
  98.  
  99. int main()
  100. {
  101. TrieNode *root;
  102. char str[MAXLEN];
  103. Construct(root);
  104. printf("\n");
  105. Traverse(root);
  106. printf("\n");
  107. while()
  108. {
  109. scanf("%s",str);
  110. if(strcmp(str,"*")==)
  111. break;
  112. printf("%s:%d\n",str,Find(root,str));
  113. }
  114.  
  115. return ;
  116. }

推荐:http://www.cnblogs.com/roucheng/p/wendang.html

字典树(Trie树)的更多相关文章

  1. 字典树(Trie树)的实现及应用

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

  2. [POJ] #1002# 487-3279 : 桶排序/字典树(Trie树)/快速排序

    一. 题目 487-3279 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 274040   Accepted: 48891 ...

  3. Atitit 常见的树形结构 红黑树  二叉树   B树 B+树  Trie树 attilax理解与总结

    Atitit 常见的树形结构 红黑树  二叉树   B树 B+树  Trie树 attilax理解与总结 1.1. 树形结构-- 一对多的关系1 1.2. 树的相关术语: 1 1.3. 常见的树形结构 ...

  4. 洛谷$P4585\ [FJOI2015]$火星商店问题 线段树+$trie$树

    正解:线段树+$trie$树 解题报告: 传送门$QwQ$ $umm$题目有点儿长我先写下题目大意趴$QwQ$,就说有$n$个初始均为空的集合和$m$次操作,每次操作为向某个集合内加入一个数$x$,或 ...

  5. luoguP6623 [省选联考 2020 A 卷] 树(trie树)

    luoguP6623 [省选联考 2020 A 卷] 树(trie树) Luogu 题外话: ...想不出来啥好说的了. 我认识的人基本都切这道题了. 就我只会10分暴力. 我是傻逼. 题解时间 先不 ...

  6. [转载]字典树(trie树)、后缀树

    (1)字典树(Trie树) Trie是个简单但实用的数据结构,通常用于实现字典查询.我们做即时响应用户输入的AJAX搜索框时,就是Trie开始.本质上,Trie是一颗存储多个字符串的树.相邻节点间的边 ...

  7. Luogu P2922 [USACO08DEC]秘密消息Secret Message 字典树 Trie树

    本来想找\(01Trie\)的结果找到了一堆字典树水题...算了算了当水个提交量好了. 直接插入模式串,维护一个\(Trie\)树的子树\(sum\)大小,求解每一个文本串匹配时走过的链上匹配数和终点 ...

  8. 字典树 trie树 学习

    一字典树 字典树,又称单词查找树,Trie树,是一种树形结构,哈希表的一个变种   二.性质 根节点不包含字符,除根节点以外的每一个节点都只包含一个字符: 从根节点到某一节点,路径上经过的字符串连接起 ...

  9. 【字符串算法】字典树(Trie树)

    什么是字典树 基本概念 字典树,又称为单词查找树或Tire树,是一种树形结构,它是一种哈希树的变种,用于存储字符串及其相关信息. 基本性质 1.根节点不包含字符,除根节点外的每一个子节点都包含一个字符 ...

  10. 字典树 Trie树

    什么是Trie树? 形如 其中从根节点到红色节点的路径上的字母所连成的字符串即为一个Trie树上所存的字符串. 比如,这个trie树上有ab,abc,bd,dda这些字符串. 至于怎么构建和查找或添加 ...

随机推荐

  1. ios NSFileManager和NSFileHandle(附:获取文件大小 )

    转自 http://blog.csdn.net/zhibudefeng/article/details/7795946 //file 文件操作 NSFileManager  常见的NSFileMana ...

  2. Atitit 数据库事务实现原理

    Atitit 数据库事务实现原理   1.1. 自己在程序中实现事务操作. 如果只是需要事务的话,你自己给mongo操作加上事务功能就可以啦..数据库事务只不过是他自己实现了而已..如果数据库不支持事 ...

  3. ngOptions

    ngOptions select as select as label for value in array <select ng-model="myColor" ng-op ...

  4. How Google TestsSoftware - Part One

    This is the firstin a series of posts on this topic.The one question I get morethan any other is &qu ...

  5. MySQL5.7.13源代码阅读心得

    1.使用gdb这个调试工具. 在linux使用该调试工具非常简单.它的价值非常大,可以告诉你函数相互调用的逻辑(bt命令),告诉你函数执行的情况(通过br命令以及n,c命令单步跟踪函数每一个语句的执行 ...

  6. HTML网页内容转换成字符串(删除从指定字符串到指定字符串)

    背景: 最近遇到个小需求就是将下面字符串去掉无用字符串 <br><br>"你爷爷也喜欢吃鱼嘛."<br><br>我笑了起来,&quo ...

  7. 项目中是用eCharts

    1.首先在项目中引入echart.js库. <!DOCTYPE HTML> <%@page contentType="text/html; charset=UTF-8&qu ...

  8. Form的enctype="multipart/form-data"作用

    <form class="form-horizontal" role="form" method="post" action=&quo ...

  9. Java多线程系列--“基础篇”04之 synchronized关键字

    概要 本章,会对synchronized关键字进行介绍.涉及到的内容包括:1. synchronized原理2. synchronized基本规则3. synchronized方法 和 synchro ...

  10. Yii2的深入学习--yii\base\Object 类

    之前我们说过 Yii2 中大多数类都继承自 yii\base\Object,今天就让我们来看一下这个类. Object 是一个基础类,实现了属性的功能,其基本内容如下: <?php namesp ...