trie树--详解
2015-07-28 11:13
295 查看
前几天学习了并查集和trie树,这里总结一下trie。 本文讨论一棵最简单的trie树,基于英文26个字母组成的字符串,讨论插入字符串、判断前缀是否存在、查找字符串等基本操作;至于trie树的删除单个节点实在是少见,故在此不做详解。
l Trie原理
Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。
l Trie性质
好多人说trie的根节点不包含任何字符信息,我所习惯的trie根节点却是包含信息的,而且认为这样也方便,下面说一下它的性质 (基于本文所讨论的简单trie树)
1. 字符的种数决定每个节点的出度,即branch数组(空间换时间思想)
2. branch数组的下标代表字符相对于a的相对位置
3. 采用标记的方法确定是否为字符串。
4. 插入、查找的复杂度均为O(len),len为字符串长度
l Trie的示意图
如图所示,该trie树存有abc、d、da、dda四个字符串,如果是字符串会在节点的尾部进行标记。没有后续字符的branch分支指向NULL
View Code
入门练习 :PKU POJ 3630解题报告
转自:Cherish_yimi (http://www.cnblogs.com/cherish_yimi/)
l Trie原理
Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。
l Trie性质
好多人说trie的根节点不包含任何字符信息,我所习惯的trie根节点却是包含信息的,而且认为这样也方便,下面说一下它的性质 (基于本文所讨论的简单trie树)
1. 字符的种数决定每个节点的出度,即branch数组(空间换时间思想)
2. branch数组的下标代表字符相对于a的相对位置
3. 采用标记的方法确定是否为字符串。
4. 插入、查找的复杂度均为O(len),len为字符串长度
l Trie的示意图
如图所示,该trie树存有abc、d、da、dda四个字符串,如果是字符串会在节点的尾部进行标记。没有后续字符的branch分支指向NULL
#include <iostream> using namespace std; const int branchNum = 26; //声明常量 int i; struct Trie_node { bool isStr; //记录此处是否构成一个串。 Trie_node *next[branchNum];//指向各个子树的指针,下标0-25代表26字符 Trie_node():isStr(false) { memset(next,NULL,sizeof(next)); } }; class Trie { public: Trie(); void insert(const char* word); bool search(char* word); void deleteTrie(Trie_node *root); private: Trie_node* root; }; Trie::Trie() { root = new Trie_node(); } void Trie::insert(const char* word) { Trie_node *location = root; while(*word) { if(location->next[*word-'a'] == NULL)//不存在则建立 { Trie_node *tmp = new Trie_node(); location->next[*word-'a'] = tmp; } location = location->next[*word-'a']; //每插入一步,相当于有一个新串经过,指针要向下移动 word++; } location->isStr = true; //到达尾部,标记一个串 } bool Trie::search(char *word) { Trie_node *location = root; while(*word && location) { location = location->next[*word-'a']; word++; } return(location!=NULL && location->isStr); } void Trie::deleteTrie(Trie_node *root) { for(i = 0; i < branchNum; i++) { if(root->next[i] != NULL) { deleteTrie(root->next[i]); } } delete root; } void main() //简单测试 { Trie t; t.insert("a"); t.insert("abandon"); char * c = "abandoned"; t.insert(c); t.insert("abashed"); if(t.search("abashed")) printf("true\n"); }
View Code
入门练习 :PKU POJ 3630解题报告
转自:Cherish_yimi (http://www.cnblogs.com/cherish_yimi/)
相关文章推荐
- oracle11g,安装失败,提示找不到文件,win7 64位下报错
- AVI文件分析解析
- 多维数组的动态分配(二三维)
- 深度学习-AlexNet入门
- XCode6添加自定义framework运行时出现dyld: Library not loaded的解决方法
- android应用中去掉标题栏的方法
- 关于svn插件突然失效问题
- 手写json
- 如何快速成为iOS游戏开发达人
- 单例模式的两种写法(刚刚)
- 最小费用最大流
- 排序练习(归并排序)
- 区间覆盖问题
- poj 2528 Mayor's posters(线段树区间覆盖、离散化)
- no version information available
- 反向代理
- 如何把Windows里的文件轻松分享给苹果Mac电脑
- 以 Python 为实例,介绍贝叶斯理论
- 新创公司同样应密切关注竞争对手
- S1293和S2220KTV项目结束