字典树 详解
来源:互联网 发布:ubuntu 安装 交换分区 编辑:程序博客网 时间:2024/05/01 01:45
http://www.cnblogs.com/biyeymyhjob/archive/2012/07/14/2591381.html
在计算机科学中,trie,又称前缀树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。
Trie 这个术语来自于 retrieval。根据词源学,trie 的发明者 Edward Fredkin 把它读作 /ˈtriː/ "tree"。但是,其他作者把它读作 /ˈtraɪ/ "try"。
在图示中,键标注在节点中,值标注在节点之下。每一个完整的英文单词对应一个特定的整数。Trie 可以看作是一个确定有限状态自动机,尽管边上的符号一般是隐含在分支的顺序中的。
键不需要被显式地保存在节点中。图示中标注出完整的单词,只是为了演示 trie 的原理。
trie 中的键通常是字符串,但也可以是其它的结构。trie 的算法可以很容易地修改为处理其它结构的有序序列,比如一串数字或者形状的排列。比如,bitwise trie 中的键是一串位元,可以用于表示整数或者内存地
Trie树是一种哈希树的变种,典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。
字典树与字典很相似,当你要查一个单词是不是在字典树中,首先看单词的第一个字母是不是在字典的第一层,如果不在,说明字典树里没有该单词,如果在就在该字母的孩子节点里找是不是有单词的第二个字母,没有说明没有该单词,有的话用同样的方法继续查找.字典树不仅可以用来储存字母,也可以储存数字等其它数据。
相对来说,Trie树是一种比较简单的数据结构.理解起来比较简单,正所谓简单的东西也得付出代价.故Trie树也有它的缺点,Trie树的内存消耗非常大.当然,或许用左儿子右兄弟的方法建树的话,可能会好点.
其基本性质可以归纳为:
1. 根节点不包含字符,除根节点外每一个节点都只包含一个字符。
2. 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
3. 每个节点的所有子节点包含的字符都不相同。
其基本操作有:查找 插入和删除,当然删除操作比较少见.我在这里只是实现了对整个树的删除操作,至于单个word的删除操作也很简单.
搜索字典项目的方法为:
(1) 从根结点开始一次搜索;
(2) 取得要查找关键词的第一个字母,并根据该字母选择对应的子树并转到该子树继续进行检索;
(3) 在相应的子树上,取得要查找关键词的第二个字母,并进一步选择对应的子树进行检索。
(4) 迭代过程……
(5) 在某个结点处,关键词的所有字母已被取出,则读取附在该结点上的信息,即完成查找。
其他操作类似处理.
//字典树的每个节点struct node { bool isWord;//判断当前字母是否是单词最后一个字母的标志 node *next[26];//后继结点可能是26个小写字母 node()//构造函数 { isWord = false; for(int i = 0 ; i < 26 ; i++) { next[i] = NULL; } } }; //字典树class TrieTree { public: node *root; TrieTree() { root = NULL; } //向字典树中插入字符串str void Insert(string str) { if(!root)//判断根节点是否为空 root = new node; node *location = root; for(int i = 0 ; i < str.length() ; i++) { int num = str[i] - 'a'; //获得当前str[i]具体是哪个小写字母,并指导应该存入哪个子节点, //在字典树中,字母b永远只可能属于第二个子节点,同样的道理,字母d永远的属于第四个节点 //应该注意的是:这样的做法浪费了大量的空节点空间。 if(location->next[num] == NULL) { location->next[num] = new node; } location = location->next[num]; } location->isWord = true;//插入后当前节点应该是一个字符串的最后一个节点 } //在字典树中查找字符串str bool Search(string str) { node *location = root; for(int i=0;i<str.length();i++) { int num = str[i] - 'a'; if(location->next[num] == NULL) return false; location = location->next[num]; } //虽然str中的所有字符全在字典树的某个路径上,但是只有isword = true时才是真正的单词 return location->isWord; } };
- 字典树详解(转载)
- 字典树 详解
- 字典树 模板+详解
- 字典树算法详解
- 字典树详解
- 字典树详解
- 字典树(Trie树)详解
- Trie树详解及其应用 字典树
- trie树(字典树)详解
- 字典树的详解与实现
- 字典数Trie树详解及其应用
- hud 1298 T9(字典树 + DFS详解)
- uchome 数据字典详解
- Oracle数据字典详解
- Oracle数据字典详解
- Oracle数据字典详解
- Oracle数据字典详解
- Oracle数据字典详解
- Android实用闹钟开发(三)---AlarmManager和Calendar
- Android 一键清理动画
- android闹钟开发(四)--音乐播放与音量调节
- android屏幕适配
- MySQL数据库插入中文出现“Incrrect Strng value '\xE9\x9C\x82'"错误
- 字典树 详解
- 去掉ExpandableListView的箭头图标
- Android设置RadioButton在文字的右边
- LoadRunner设置检查点的几种方法介绍
- BUPT Summer Journey #test7 E
- 64位Linux上编译32位软件
- 清除浮动的方法
- poj 1656 Counting Black
- mantle相关,待研究