字典树(Trie树)
1. trie基础
(1) 是什么?
Trie,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。
(2) 性质
- 根节点不包含字符,除根节点外每一个节点都只包含一个字符
- 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串
- 每个节点的所有子节点包含的字符都不相同
例如,单词序列a, to, tea, ted, ten, i, in, inn,对应的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树)的更多相关文章
- 字典树(Trie树)的实现及应用
>>字典树的概念 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树.与二叉查找树不同,Trie树的 ...
- [POJ] #1002# 487-3279 : 桶排序/字典树(Trie树)/快速排序
一. 题目 487-3279 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 274040 Accepted: 48891 ...
- Atitit 常见的树形结构 红黑树 二叉树 B树 B+树 Trie树 attilax理解与总结
Atitit 常见的树形结构 红黑树 二叉树 B树 B+树 Trie树 attilax理解与总结 1.1. 树形结构-- 一对多的关系1 1.2. 树的相关术语: 1 1.3. 常见的树形结构 ...
- 洛谷$P4585\ [FJOI2015]$火星商店问题 线段树+$trie$树
正解:线段树+$trie$树 解题报告: 传送门$QwQ$ $umm$题目有点儿长我先写下题目大意趴$QwQ$,就说有$n$个初始均为空的集合和$m$次操作,每次操作为向某个集合内加入一个数$x$,或 ...
- luoguP6623 [省选联考 2020 A 卷] 树(trie树)
luoguP6623 [省选联考 2020 A 卷] 树(trie树) Luogu 题外话: ...想不出来啥好说的了. 我认识的人基本都切这道题了. 就我只会10分暴力. 我是傻逼. 题解时间 先不 ...
- [转载]字典树(trie树)、后缀树
(1)字典树(Trie树) Trie是个简单但实用的数据结构,通常用于实现字典查询.我们做即时响应用户输入的AJAX搜索框时,就是Trie开始.本质上,Trie是一颗存储多个字符串的树.相邻节点间的边 ...
- Luogu P2922 [USACO08DEC]秘密消息Secret Message 字典树 Trie树
本来想找\(01Trie\)的结果找到了一堆字典树水题...算了算了当水个提交量好了. 直接插入模式串,维护一个\(Trie\)树的子树\(sum\)大小,求解每一个文本串匹配时走过的链上匹配数和终点 ...
- 字典树 trie树 学习
一字典树 字典树,又称单词查找树,Trie树,是一种树形结构,哈希表的一个变种 二.性质 根节点不包含字符,除根节点以外的每一个节点都只包含一个字符: 从根节点到某一节点,路径上经过的字符串连接起 ...
- 【字符串算法】字典树(Trie树)
什么是字典树 基本概念 字典树,又称为单词查找树或Tire树,是一种树形结构,它是一种哈希树的变种,用于存储字符串及其相关信息. 基本性质 1.根节点不包含字符,除根节点外的每一个子节点都包含一个字符 ...
- 字典树 Trie树
什么是Trie树? 形如 其中从根节点到红色节点的路径上的字母所连成的字符串即为一个Trie树上所存的字符串. 比如,这个trie树上有ab,abc,bd,dda这些字符串. 至于怎么构建和查找或添加 ...
随机推荐
- Unity3D骨骼动画的分解(CleanData.Ani详解)
CleanData是什么 CleanData以前没有特定的名字,(在easydown这个开源项目中,作为一个GameObjParser模块存在).在某三国项目中,我们使用GameObjParser将N ...
- java线程与并发(一)
有好几个月没写博客了,各种破事儿忙完,决定继续写博客,恰好最近想了解下有关Java并发的一些知识,所以就准备这一段时间,用零碎的时间多记录一点有关并发的知识.希望这次能一直坚持下去. 想了解并发,必须 ...
- C#实现的等额本息法、按月付息到期还本法、一次性还本付息法
你若懂行,那便有用,如下: void Main(){ var x = DengEBenXi.Compute(11111, 12, 3); x.Dump(); var y = AnYu ...
- [我给Unity官方视频教程做中文字幕]beginner Graphics – Lessons系列之摄像机介绍Cameras
[我给Unity官方视频教程做中文字幕]beginner Graphics – Lessons系列之摄像机介绍Cameras 最近得到一些Unity官方视频教程,一看全是纯英文的讲解,没有任何字幕或者 ...
- Linux grep与正则表达式
grep命令 格式:grep [-acinv] [--color=auto] '查找字符串' filename -a 将binary文件以text文件的 -c 计算找到 ‘查找字符串’ ...
- PHP面向对象06_异常处理
oop06异常处理 2014-9-2 8:36:33 NotePad++ By jiancaigege 摘要: 1.异常处理 2.类中常用函数 异常处理 语法格式: try{ //捕获异常 }catc ...
- iOS开发中数组常用的五种遍历方式
随着iOS的不断发展,apple也不断推出性能更高的数组遍历方式,下面将对熟悉的五种遍历方式进行列举. 首先定义一个数组,并获取数组长度 NSArray *array=@[",]; NSIn ...
- Atitit usbQb212 oo 面向对象封装的标准化与规范解决方案java c# php js
Atitit usbQb212 oo 面向对象封装的标准化与规范解决方案java c# php js 1.1. 封装性是面象对象编程中的三大特性之一 三个基本的特性:封装.继承与多态1 1.2. 魔 ...
- iOS-UICollectionView
1--------------------------------------------------------------------------------------------------- ...
- EasyUI Field
效果: JS: var sortIndex = $("#ListDiv").find(".datagrid-view2").find(".datagr ...