字典树(Trie树)

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]==‘\0‘)
 21         return;
 22     cur=root;
 23     for(i=0;word[i]!=‘\0‘;i++)
 24     {
 25         if(cur->next[word[i]]==NULL)
 26         {
 27             TrieNode *newNode = (TrieNode *)malloc(sizeof(TrieNode));
 28             memset(newNode,0,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=0;
 43      root = (TrieNode *)malloc(sizeof(TrieNode));
 44      memset(root,0,sizeof(TrieNode));
 45      while(1)
 46      {
 47          scanf("%s",inStr);
 48          if(strcmp(inStr,"*")==0)
 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=0;
 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=0;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=0;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(1)
108     {
109         scanf("%s",str);
110         if(strcmp(str,"*")==0)
111             break;
112         printf("%s:%d\n",str,Find(root,str));
113     }
114
115     return 0;
116 }  

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

时间: 2024-11-10 07:07:28

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

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

一. 题目 487-3279 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 274040   Accepted: 48891 Description Businesses like to have memorable telephone numbers. One way to make a telephone number memorable is to have it spell a memorable word or

字典树Trie树

一.字典树 字典树--Trie树,又称为前缀树(Prefix Tree).单词查找树或键树,是一种多叉树结构. 上图是一棵Trie树,表示了关键字集合{"a", "to", "tea", "ted", "ten", "i", "in", "inn"} .从上图可以归纳出Trie树的基本性质: 1. 根节点不包含字符,除根节点外的每一个子节点都包含一

Atitit 常见的树形结构 红黑树 &#160;二叉树 &#160;&#160;B树 B+树 &#160;Trie树&#160;attilax理解与总结

Atitit 常见的树形结构 红黑树  二叉树   B树 B+树  Trie树 attilax理解与总结 1.1. 树形结构-- 一对多的关系1 1.2. 树的相关术语: 1 1.3. 常见的树形结构 红黑树  二叉树   B树 B+树  Trie树2 1.4. 满二叉树和完全二叉树..完全二叉树说明深度达到完全了.2 1.5. 属的逻辑表示 树形比奥死,括号表示,文氏图,凹镜法表示3 1.6. 二叉树是数据结构中一种重要的数据结构,也是树表家族最为基础的结构.3 1.6.1. 3.2 平衡二叉

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

(1)字典树(Trie树) Trie是个简单但实用的数据结构,通常用于实现字典查询.我们做即时响应用户输入的AJAX搜索框时,就是Trie开始.本质上,Trie是一颗存储多个字符串的树.相邻节点间的边代表一个字符,这样树的每条分支代表一则子串,而树的叶节点则代表完整的字符串.和普通树不同的地方是,相同的字符串前缀共享同一条分支.还是例子最清楚.给出一组单词,inn, int, at, age, adv, ant, 我们可以得到下面的Trie: 可以看出: 每条边对应一个字母. 每个节点对应一项前

【数据结构】字典树/Trie树/前缀树 - 字符串的统计、排序和保存

字典树 描述 字典树,又称单词查找树.Trie树.前缀树,是一种树形结构,是一种哈希树的变种. 典型应用是用于统计.排序和保存大量的字符串(但不仅限于字符串). 常见操作有插入和查找,删除操作少见. 性质 根节点不包含字符 除根节点外每一个节点都只包含一个字符 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串 每个节点的所有子节点包含的字符都不相同 优点 利用字符串的公共前缀来减少查询时间 最大限度地减少无谓的字符串比较 查询效率比哈希树高 自带字典序排序 直接判断重复,或者记

树-trie树

字典树(trie树) (图f) 字典树是一种以树形结构保存大量字符串.以便于字符串的统计和查找,经常被搜索引擎系统用于文本词频统计.它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高.具有以下特点(图f):(1)根节点为空:(2)除根节点外,每个节点包含一个字符:(3)从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串.(4)每个字符串在建立字典树的过程中都要加上一个区分的结束符,避免某个短字符串正好是某个长字符串的前缀而淹没. T

【BZOJ3217】ALOEXT 替罪羊树+Trie树

[BZOJ3217]ALOEXT Description taorunz平时最喜欢的东西就是可移动存储器了……只要看到别人的可移动存储器,他总是用尽一切办法把它里面的东西弄到手. 突然有一天,taorunz来到了一个密室,里面放着一排可移动存储器,存储器里有非常珍贵的OI资料……不过比较特殊的是,每个存储器上都写着一个非负整数.taorunz很高兴,要把所有的存储器都拿走(taorunz的智商高达500,他一旦弄走了这里的所有存储器,在不久到来的AHOI和NOI中……你懂的).不过这时有一个声音

HiHo1014 : Trie树(Trie树模板题)

描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一本词典,于是小Hi就向小Ho提出了那个经典的问题:“小Ho,你能不能对于每一个我给出的字符串,都在这个词典里面找到以这个字符串开头的所有单词呢?” 身经百战的小Ho答道:“怎么会不能呢!你每给我一个字符串,我就依次遍历词典里的所有单词,检查你给我的字符串是不是这个单词的前缀不就是了?” 小Hi笑道:“你啊,还是太年轻了!~假设这本词典里有10万个单

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

剑指Offer--Trie树(字典树) Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高. Trie的核心思想是空间换时间.利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的. Trie树也有它的缺点,Trie树的内存消耗非常大.当然,或许用左儿子右兄弟的方法建树的话,可能会好点.可见,优

【转】B树、B-树、B+树、B*树、红黑树、 二叉排序树、trie树Double Array 字典查找树简介

B  树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: B树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中:否则,如果查询关键字比结点关键字小,就进入左儿子:如果比结点关键字大,就进入右儿子:如果左儿子或右儿子的指针为空,则报告找不到相应的关键字: 如果B树的所有非叶子结点的左右子树的结点数目均保持差不多(平衡),那么B树的搜索性