字典树(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这些字符串. 至于怎么构建和查找或添加 ...
随机推荐
- ios NSFileManager和NSFileHandle(附:获取文件大小 )
转自 http://blog.csdn.net/zhibudefeng/article/details/7795946 //file 文件操作 NSFileManager 常见的NSFileMana ...
- Atitit 数据库事务实现原理
Atitit 数据库事务实现原理 1.1. 自己在程序中实现事务操作. 如果只是需要事务的话,你自己给mongo操作加上事务功能就可以啦..数据库事务只不过是他自己实现了而已..如果数据库不支持事 ...
- ngOptions
ngOptions select as select as label for value in array <select ng-model="myColor" ng-op ...
- 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 ...
- MySQL5.7.13源代码阅读心得
1.使用gdb这个调试工具. 在linux使用该调试工具非常简单.它的价值非常大,可以告诉你函数相互调用的逻辑(bt命令),告诉你函数执行的情况(通过br命令以及n,c命令单步跟踪函数每一个语句的执行 ...
- HTML网页内容转换成字符串(删除从指定字符串到指定字符串)
背景: 最近遇到个小需求就是将下面字符串去掉无用字符串 <br><br>"你爷爷也喜欢吃鱼嘛."<br><br>我笑了起来,&quo ...
- 项目中是用eCharts
1.首先在项目中引入echart.js库. <!DOCTYPE HTML> <%@page contentType="text/html; charset=UTF-8&qu ...
- Form的enctype="multipart/form-data"作用
<form class="form-horizontal" role="form" method="post" action=&quo ...
- Java多线程系列--“基础篇”04之 synchronized关键字
概要 本章,会对synchronized关键字进行介绍.涉及到的内容包括:1. synchronized原理2. synchronized基本规则3. synchronized方法 和 synchro ...
- Yii2的深入学习--yii\base\Object 类
之前我们说过 Yii2 中大多数类都继承自 yii\base\Object,今天就让我们来看一下这个类. Object 是一个基础类,实现了属性的功能,其基本内容如下: <?php namesp ...