Trie—单词查找树 l 简介
2016-05-23 01:23
393 查看
Trie—单词查找树
l 简介
Trie,又称单词查找树、前缀树,是一种哈希树的变种。应用于字符串的统计与排序,经常被搜索引擎系统用于文本词频统计。
![](http://www.cppblog.com/images/cppblog_com/yuyang7/image001.gif)
含有单词“tea”“tree”“A”“ZSU”的一棵Trie。
l 性质
n 根节点不包含字符,除根节点外的每一个节点都只包含一个字符。
n 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
n 每个节点的所有子节点包含的字符都不相同。
l 优点
n 查询快。对于长度为m的键值,最坏情况下只需花费O(m)的时间;而BST最坏情况下需要O(m log n)的时间。
n 当存储大量字符串时,Trie耗费的空间较少。因为键值并非显式存储的,而是与其他键值共享子串。
n Trie适用于“最长前缀匹配”。
l 操作
n 初始化或清空
遍历Trie,删除所有节点,只保留根节点。
n 插入字符串
1. 设置当前节点为根节点,设置当前字符为插入字符串中的首个字符;
2. 在当前节点的子节点上搜索当前字符,若存在,则将当前节点设为值为当前字符的子节点;否则新建一个值为当前字符的子节点,并将当前结点设置为新创建的节点。.
3. 将当前字符设置为串中的下个字符,若当前字符为0,则结束;否则转2.
![](http://www.cppblog.com/images/cppblog_com/yuyang7/image003.gif)
n 查找字符串
搜索过程与插入操作类似,当字符找不到匹配时返回假;若全部字符都存在匹配,判断最终停留的节点是否为树叶,若是,则返回真,否则返回假。
![](http://www.cppblog.com/images/cppblog_com/yuyang7/image005.gif)
![](http://www.cppblog.com/images/cppblog_com/yuyang7/image007.gif)
n 删除字符串
首先查找该字符串,边查询边将经过的节点压栈,若找不到,则返回假;否则依次判断栈顶节点是否为树叶,若是则删除该节点,否则返回真。
![](http://www.cppblog.com/images/cppblog_com/yuyang7/image09.gif)
l 实现
对于字符表大小为S的字符串集,需建立一个S叉树来代表这些字符串的集合。
l [b]代码
[/b]
参考资料
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
/** 版权所有 (C) 2009 喻扬 中山大学
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
/* 本程序只作学习用途,未经许可,不得用于任何商业目的。
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
*/
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#include <string.h>
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
/* trie的节点类型 */
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
template <int Size> //Size为字符表的大小
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
struct trie_node
![](http://www.cppblog.com/Images/dot.gif)
;
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
/* trie */
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
template <int Size, typename Index> //Size为字符表的大小,Index为字符表的哈希函数
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
class trie
![](http://www.cppblog.com/Images/dot.gif)
;
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
l
英文维基 http://en.wikipedia.org/wiki/Trie
中文维基 http://zh.wikipedia.org/w/index.php?title=Trie&variant=zh-cn
文章来源:http://www.cppblog.com/yuyang7/archive/2009/03/27/78083.html
l 简介
Trie,又称单词查找树、前缀树,是一种哈希树的变种。应用于字符串的统计与排序,经常被搜索引擎系统用于文本词频统计。
![](http://www.cppblog.com/images/cppblog_com/yuyang7/image001.gif)
含有单词“tea”“tree”“A”“ZSU”的一棵Trie。
l 性质
n 根节点不包含字符,除根节点外的每一个节点都只包含一个字符。
n 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
n 每个节点的所有子节点包含的字符都不相同。
l 优点
n 查询快。对于长度为m的键值,最坏情况下只需花费O(m)的时间;而BST最坏情况下需要O(m log n)的时间。
n 当存储大量字符串时,Trie耗费的空间较少。因为键值并非显式存储的,而是与其他键值共享子串。
n Trie适用于“最长前缀匹配”。
l 操作
n 初始化或清空
遍历Trie,删除所有节点,只保留根节点。
n 插入字符串
1. 设置当前节点为根节点,设置当前字符为插入字符串中的首个字符;
2. 在当前节点的子节点上搜索当前字符,若存在,则将当前节点设为值为当前字符的子节点;否则新建一个值为当前字符的子节点,并将当前结点设置为新创建的节点。.
3. 将当前字符设置为串中的下个字符,若当前字符为0,则结束;否则转2.
![](http://www.cppblog.com/images/cppblog_com/yuyang7/image003.gif)
n 查找字符串
搜索过程与插入操作类似,当字符找不到匹配时返回假;若全部字符都存在匹配,判断最终停留的节点是否为树叶,若是,则返回真,否则返回假。
![](http://www.cppblog.com/images/cppblog_com/yuyang7/image005.gif)
![](http://www.cppblog.com/images/cppblog_com/yuyang7/image007.gif)
n 删除字符串
首先查找该字符串,边查询边将经过的节点压栈,若找不到,则返回假;否则依次判断栈顶节点是否为树叶,若是则删除该节点,否则返回真。
![](http://www.cppblog.com/images/cppblog_com/yuyang7/image09.gif)
l 实现
对于字符表大小为S的字符串集,需建立一个S叉树来代表这些字符串的集合。
l [b]代码
[/b]
参考资料
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
/** 版权所有 (C) 2009 喻扬 中山大学
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
/* 本程序只作学习用途,未经许可,不得用于任何商业目的。
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
*/
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#include <string.h>
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
/* trie的节点类型 */
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
template <int Size> //Size为字符表的大小
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
struct trie_node
![](http://www.cppblog.com/Images/dot.gif)
;
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
/* trie */
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
template <int Size, typename Index> //Size为字符表的大小,Index为字符表的哈希函数
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
class trie
![](http://www.cppblog.com/Images/dot.gif)
;
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
l
英文维基 http://en.wikipedia.org/wiki/Trie
中文维基 http://zh.wikipedia.org/w/index.php?title=Trie&variant=zh-cn
文章来源:http://www.cppblog.com/yuyang7/archive/2009/03/27/78083.html
相关文章推荐
- Lucene参与项目持久层中对于索引库的增删改查
- UIButton无法响应点击事件问题
- leetcode_c++:trappint rain water(042)
- 以太坊(Ethereum)开发框架 Truffle:引言
- 频繁修改UIButton的文字引起的频闪问题解决办法
- 字符串匹配的KMP算法
- Linux实践:模块
- 字符串匹配的KMP算法
- webView简单使用:网页中有电话,在客户端点击打电话(一)
- 查找算法
- [读书笔记]Android IPC机制(一)
- require,include,require_once,include_once的区别
- 排列组合 hdu5698 瞬间移动
- C++ 中的名称冲突之 "y1"
- 常见的查找算法
- 栈的顺序存储的实现代码
- 关于滚动数组
- 典型的查找算法
- 一步一步写算法(之查找)等一系列算法
- 五种查找算法总结