字典树简介
来源:互联网 发布:什么软件买火车票便宜 编辑:程序博客网 时间:2024/06/15 18:08
Trie,
又称字典树、单词查找树,是一种树形结构,用于保存大量的字符串。它的优点是:利用字符串的公共前缀来节约存储空间。
相对来说,Trie树是一种比较简单的数据结构.理解起来比较简单,正所谓简单的东西也得付出代价.故Trie树也有它的缺点,Trie树的内存消耗非常大.当然,或许用左儿子右兄弟的方法建树的话,可能会好点.
其核心思想就是空间换时间。
基本性质·····
搜索字典项目的方法····
查找效率分析····
相关练习······
字典树的应用····
实现方法······
一、基本性质
1. 根节点不包含字符,除根节点外每一个节点都只包含一个字符。
2. 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
3. 每个节点的所有子节点包含的字符都不相同。
其基本操作有:查找插入和删除,当然删除操作比较少见.我在这里只是实现了对整个树的删除操作,至于单个word的删除操作也很简单.
二、搜索字典项目的方法为:
(1)
(2)
(3)在相应的子树上,取得要查找关键词的第二个字母,并进一步选择对应的子树进行检索。
(4)迭代过程……
(5)在某个结点处,关键词的所有字母已被取出,则读取附在该结点上的信息,即完成查找。
三、查找效率分析
在trie树中查找一个关键字的时间和树中包含的结点数无关,而取决于组成关键字的字符数。(对比:二叉查找树的查找时间和树中的结点数有关O(log2n)。)
如果要查找的关键字可以分解成字符序列且不是很长,利用trie树查找速度优于二叉查找树。
若关键字长度最大是5,则利用trie树,利用5次比较可以从265=11881376个可能的关键字中检索出指定的关键字。而利用二叉查找树至少要进行log2265=23.5次比较。
四、相关练习
HDOJ-1075
HDOJ-1251
HDOJ-1298
HDOJ-1800
ZOJ-1109
五、字典树的应用
1.字典树在串的快速检索中的应用。
给出N个单词组成的熟词表,以及一篇全用小写英文书写的文章,请你按最早出现的顺序写出所有不在熟词表中的生词。
在这道题中,我们可以用数组枚举,用哈希,用字典树,先把熟词建一棵树,然后读入文章进行比较,这种方法效率是比较高的。
2.
给定N个互不相同的仅由一个单词构成的英文名,让你将他们按字典序从小到大输出
用字典树进行排序,采用数组的方式创建字典树,这棵树的每个结点的所有儿子很显然地按照其字母大小排序。对这棵树进行先序遍历即可
3.
对所有串建立字典树,对于两个串的最长公共前缀的长度即他们所在的结点的公共祖先个数,于是,问题就转化为最近公共祖先问题。
>>>>>>>>
六、实现方法
实现一般分为两种,一种是结点类型包含存放字符值的char类型和26个指向结点孩子的结构体指针类型,另一种则是用整型值n代表该字符出现的次数而非用char存放元素的值。
第一种:
#include"stdio.h"
#include "stdlib.h"
#include"string.h"
#define BRANCH_COUNT26
typedef struct Trie_Node
{
}*Node;
int Insert(Noderoot,char *string,char *data)
{
}
int Search(Node root,char*string,char *search_result)
{
}
第二种:这一种是用数组来分配空间的,话说malloc太慢了。。
#define
typedef struct TrieNode
{
}TrieNode;
TrieNode Memory[1000000];
int allocp = 0;
void InitTrieRoot(TrieNode**pRoot)
{
}
TrieNode *CreateTrieNode()
{
}
void InsertTrie(TrieNode **pRoot ,char *s)
{
}
//查找
int SearchTrie(TrieNode **pRoot , char *s)
{
}
- 字典树简介
- 字典树简介
- 字典树应用(1)字典树简介
- Trie树|字典树的简介
- Trie树|字典树的简介
- 字典树简介和简易应用
- Oracle 数据字典简介
- ORACLE数据字典简介
- 数据字典简介
- 字典(map)简介
- 数据字典简介
- 可变字典(NSMutableDictionary)简介
- Python 有序字典简介
- C# Dictionary 字典简介
- Python字典(dict)简介
- Tire树(字典树、前缀树)的简介和构造
- Trie树|字典树的简介及实现
- Trie树|字典树的简介及实现
- using namespace std 详解
- strlen
- 二叉树的遍历问题总结
- C++ __int64 类型
- 常用字符,整形,浮点型相互…
- 字典树简介
- warning: no newline at the end of file
- Nginx集群
- android之Fragment
- {转载}Linux Top 命令解析 比较详细 {from:http://www.jb51.net/LINUXjishu/34604.html}
- ext 4.1关于一个对象下面有几个对象,前台新建后发生后台的解决办法。
- long 类型的字节长度
- OpenStack Swift遇到了Erasure Code
- 如何用GCC编译生成动态链接库*.SO文件 动态库