字典树(Trie树)

时间:2021-08-18 03:48:21

1. trie基础

(1) 是什么?

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

(2) 性质

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

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

字典树(Trie树)

(3) 应用

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

(4) 优点

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

2. 一个例子

 #include <stdio.h>
#include <string.h>
#include <stdlib.h> #define MAX 256//ascii码有256个字符,故每棵树的子节点最多有256个
#define MAXLEN 256//单词最长为256 typedef struct TrieNode
{
int count;
struct TrieNode *next[MAX];
}TrieNode; //插入一个单词
void Insert(char *word,TrieNode *root) {
int i;
TrieNode *cur;
if(word[]=='\0')
return;
cur=root;
for(i=;word[i]!='\0';i++)
{
if(cur->next[word[i]]==NULL)
{
TrieNode *newNode = (TrieNode *)malloc(sizeof(TrieNode));
memset(newNode,,sizeof(TrieNode));
cur->next[word[i]]=newNode;
}
cur=cur->next[word[i]];
} cur->count++;
return;
} //创建树输入每个单词,以回车结束,则单词被插入树中,碰到*停止树的创建
void Construct(TrieNode *&root)
{
char inStr[MAXLEN];
int size=;
root = (TrieNode *)malloc(sizeof(TrieNode));
memset(root,,sizeof(TrieNode));
while()
{
scanf("%s",inStr);
if(strcmp(inStr,"*")==)
break;
Insert(inStr,root);
}
return;
} //遍历整棵树
void Traverse(TrieNode *curP)
{
static char theWord[MAXLEN];
static int pos=;
int i;
if(curP==NULL)
return;
if(curP->count)
{
theWord[pos]='\0';
printf("%s:%d\n",theWord,curP->count);
}
for(i=;i<MAX;i++)
{
theWord[pos++]=i;
//从这句话可以看出在递归调用子节点前,子节点的值已经加入到单词中了
Traverse(curP->next[i]);
pos--;
}
return;
} //查找一个单词是不是在树中
bool Find(TrieNode *root,char *word)
{
int i;
TrieNode *cur;
cur=root;
for(i=;word[i]!='\0';i++)
{
if(cur->next[word[i]]==NULL)
{
return false;
}
cur=cur->next[word[i]];
} if(cur->count)
return true;
else
return false;
} /* 何问起 hovertree.com */ int main()
{
TrieNode *root;
char str[MAXLEN];
Construct(root);
printf("\n");
Traverse(root);
printf("\n");
while()
{
scanf("%s",str);
if(strcmp(str,"*")==)
break;
printf("%s:%d\n",str,Find(root,str));
} return ;
}

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

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

  1. 字典树&lpar;Trie树&rpar;的实现及应用

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

  2. &lbrack;POJ&rsqb; &num;1002&num; 487-3279 &colon; 桶排序&sol;字典树&lpar;Trie树&rpar;&sol;快速排序

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

  3. Atitit 常见的树形结构 红黑树 &&num;160&semi;二叉树 &&num;160&semi;&&num;160&semi;B树 B&plus;树 &&num;160&semi;Trie树&&num;160&semi;attilax理解与总结

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

  4. 洛谷&dollar;P4585&bsol; &lbrack;FJOI2015&rsqb;&dollar;火星商店问题 线段树&plus;&dollar;trie&dollar;树

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

  5. &lbrack;转载&rsqb;字典树&lpar;trie树&rpar;、后缀树

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

  6. Luogu P2922 &lbrack;USACO08DEC&rsqb;秘密消息Secret Message 字典树 Trie树

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

  7. 字典树 trie树 学习

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

  8. 【字符串算法】字典树&lpar;Trie树&rpar;

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

  9. 字典树 Trie树

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

  10. 【HDU - 5790 】Prefix(主席树&plus;Trie树)

    BUPT2017 wintertraining(15) #7C 题意 求[min((Z+L)%N,(Z+R)%N)+1,max((Z+L)%N,(Z+R)%N)+1]中不同前缀的个数,Z是上次询问的结 ...

随机推荐

  1. java中静态方法和静态类的学习

    静态内部类可以有静态成员,而非静态类 则不能有静态成员 静态内部类的非静态成员可以访问外部类的静态成员,而不可以访问外部类的非静态成员 非静态方法与对象相关,而静态方法属于类的方法, 总上所述:静态方 ...

  2. boost之lexical&lowbar;cast

    第一次翻译,虽然是个很简单的函数介绍... 文件boost/lexical_cast.hpp中定义了此函数: namespace boost { class bad_lexical_cast; tem ...

  3. CentOS6&period;5菜鸟之旅:纯转载Linux目录结构

    来自:http://www.iteye.com/topic/1125162 使用linux也有一年多时间了  最近也是一直在维护网站系统主机  下面是linux目录结构说明 本人使用的是centos系 ...

  4. 【POJ 3020】Antenna Placement&lpar;二分图匹配&rpar;

    相当于用1*2的板覆盖给定的h*w的格子里的点,求最少的板.可以把格子相邻的分成两个集合,如下图,0为一个集合,1的为一个,也就是(行数+列数)为奇数的是一个集合,为偶数的为另一个集合.1010101 ...

  5. Please verify you invoked Maven from the correct directory

    解决办法: 在cmd中,把当前路径转换到一个含有pom文件的 项目路径下 再使用 类似下面的deploy就行 mvn deploy:deploy-file -DgroupId=com.taobao.n ...

  6. IO 调优

    磁盘优化 1.增加缓存 2.优化磁盘的管理系统 3.设计合理的磁盘存储数据块 4.应用合理的RAID策略 TCP网络参数调优 网络IO优化 1.减少网络交互次数 2.减少网络传输数据量的大小 3.尽量 ...

  7. Linux初学者必知的5个学习网站

    分享几个Linux初学者一定要知道的5个学习网站 工具/原料 有一颗学习Linux的心 电脑 方法/步骤 1 推荐一:鸟哥的Linux私房菜(http://vbird.dic.ksu.edu.tw/) ...

  8. Nginx实现数据库端口转发

    前言 因开发.测试.生成等服务器网络策略问题,导致部分服务器A需要访问数据库而无法正常访问数据库,此处采用端口代理方式解决此问题,即通过一台能正常访问数据库的服务器B做tcp端口代理,实现服务器A通过 ...

  9. ubuntu下安装ftp服务器

    参考文献: 5.4 FTP 服务器 vsftpd - FTP 服务器安装 vsftpd 是可在 Ubuntu 中使用的 FTP 守护程序之一.它在安装.设置和维护方面十分方便.要安装 vsftpd 您 ...

  10. JS设计模式——8&period;桥接模式

    桥接模式的用途 在实现API的时候,桥接模式非常有用. 在设计一个JavaScript API的时候,可以用这个模式来弱化它与使用它的类和对象之间的耦合. 示例:事件监听器 桥接模式最常见和实际的应用 ...