Trie树及其应用
Trie树及其应用
Trie树
Trie树,又称单词查找树、字典树,是一种树形结构,是一种哈希树的变种,是一种用于快速检索的多叉树结构。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。
Trie树的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。 Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。 Trie树也有它的缺点,Trie树的内存消耗非常大.
Trie树的结构特点:
1.root结点没有数据
2.除根结点外每个结点只包含一个字符
3.从根结点到某一个结点正好组成一个字符串
Trie树的大致结构如下:
Trie树的实现
下面是一个简单的Trie树的实现,假定只包括26个字符,忽略大小写。
|
1
|
|

#include <stdlib.h>
class Trie{
public:
Trie();
~Trie();
int insert(const char* str);
int search(const char* str)const;
int remove(const char* str);
static const int CharNum = 26;
protected:
typedef struct s_Trie_Node{
bool isExist;
struct s_Trie_Node* branch[Trie::CharNum];
s_Trie_Node();
}Trie_Node;
Trie_Node* root;
};
Trie::Trie():root(NULL){}
Trie::~Trie(){}
Trie::s_Trie_Node::s_Trie_Node():isExist(false){
for(int i = 0; i < Trie::CharNum; ++i){
branch[i] = NULL;
}
}
int Trie::insert(const char* str){
if(root == NULL){
root = new Trie_Node();
}
Trie_Node* pos = root;
int char_pos;
while(pos != NULL && *str != '\0'){
if(*str >= 'a' && *str <= 'z'){
char_pos = *str - 'a';
} else if(*str >= 'A' && *str <= 'Z'){
char_pos = *str - 'A';
} else {
return -1;
}
if(pos->branch[ char_pos] == NULL){
pos->branch[ char_pos ] = new Trie_Node();
}
pos = pos->branch[ char_pos ];
str++;
}
if(pos->isExist){
return 0;
} else {
pos->isExist = true;
return 1;
}
}
int Trie::search(const char* str)const{
Trie_Node* pos = root;
int char_pos;
while(pos != NULL && *str != '\0'){
if(*str >= 'a' && *str <= 'z'){
char_pos = *str - 'a';
} else if(*str >= 'A' && *str <= 'Z'){
char_pos = *str - 'A';
} else {
return -1;
}
pos = pos->branch[char_pos];
str++;
}
if(pos != NULL && pos->isExist){
return 1;
} else {
return 0;
}
}
int Trie::remove(const char* str){
Trie_Node* pos = root;
int char_pos;
while(pos != NULL && *str != '\0'){
if(*str >= 'a' && *str <= 'z'){
char_pos = *str - 'a';
} else if(*str >= 'A' && *str <= 'Z'){
char_pos = *str - 'A';
} else {
return -1;
}
pos = pos->branch[ char_pos ];
str++;
}
if(pos != NULL && pos->isExist){
pos->isExist = false;
return 1;
} else {
return 0;
}
}

|
1
|
|
Trie树的应用
1. 大量字符串的统计,查找
用的比较多的场合,例如:搜索引擎对文本中词频的统计,搜索引擎日志对用户关键词搜索频率的统计,等等。下面讨论两道经典的面试题:
1.找出大量日志文件中,出现次数前10的网址。
这个问题使用Trie树再适合不过了,对于大量日志文件的统计,使用trie树速度相当快。结合最小堆和trie树,对日志文件搜索一次就可以得到结果。
2.实现一个网站的输入提示功能
这个问题需要在用户输入的时候,实时展示输入建议,使用trie树可以轻松实现。
2.字符串的排序
对于大规模字符串的排序,只需要统计一次字符串,构造trie树,然后遍历输出就得到排序结果。
3.找字符串的最长公共前缀
这个问题显而易见。
作者:bigwangdi
出处:http://www.cnblogs.com/bigwangdi/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
Stay Hungry, Stay Foolish!!
Trie树及其应用的更多相关文章
- 基于trie树做一个ac自动机
基于trie树做一个ac自动机 #!/usr/bin/python # -*- coding: utf-8 -*- class Node: def __init__(self): self.value ...
- 基于trie树的具有联想功能的文本编辑器
之前的软件设计与开发实践课程中,自己构思的大作业题目.做的具有核心功能,但是还欠缺边边角角的小功能和持久化数据结构,先放出来,有机会一点点改.github:https://github.com/chu ...
- hihocoder-1014 Trie树
hihocoder 1014 : Trie树 link: https://hihocoder.com/problemset/problem/1014 题意: 实现Trie树,实现对单词的快速统计. # ...
- 洛谷P2412 查单词 [trie树 RMQ]
题目背景 滚粗了的HansBug在收拾旧英语书,然而他发现了什么奇妙的东西. 题目描述 udp2.T3如果遇到相同的字符串,输出后面的 蒟蒻HansBug在一本英语书里面找到了一个单词表,包含N个单词 ...
- 通过trie树实现单词自动补全
/** * 实现单词补全功能 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #incl ...
- #1014 Trie树
本题主要是求构造一棵Trie树,即词典树用于统计单词. C#代码如下: using System; using System.Collections.Generic; using System.Lin ...
- Trie树-字典查找
描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一本词典,于是小Hi就向小Ho提出了那个经典的问题: ...
- Trie树的创建、插入、查询的实现
原文:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=28977986&id=3807947 1.什么是Trie树 Tr ...
- Trie树(c++实现)
转:http://www.cnblogs.com/kaituorensheng/p/3602155.html http://blog.csdn.net/insistgogo/article/detai ...
- [转]双数组TRIE树原理
原文名称: An Efficient Digital Search Algorithm by Using a Double-Array Structure 作者: JUN-ICHI AOE 译文: 使 ...
随机推荐
- js checkbox多选值采集
var objs = document.getElementsByTagName("input"); for (var i = 0; i < objs.length; i++ ...
- c# 文件同步服务器,iis 集群 ,代码同步(二)
打算自己做一个 集群 代码同步软件. 基于Socket 和 FileSystemWatcher .
- sgu139Help Needed!推断15数码是否有解,以及推断N数码是否有解的推论
是这种,要你推断一个15数码是否有解. 我不会,找了这样一个方法. 将16个数按出现顺序存放在一维数组里面, 然后累加每一个数的逆序对数目, 还要加上0到终态的曼哈顿距离,得到一个数x. 因为最后的状 ...
- 分享一个SQLSERVER脚本
原文:分享一个SQLSERVER脚本 分享一个SQLSERVER脚本 很多时候我们都需要计算数据库中各个表的数据量很每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tablespac ...
- JS分析URL字符串,取得参数名,AJAX传参请求代码示例
//当前页面URL中参数分析函数,正则校验 function getQueryString(name) { var reg = new RegExp("(^|&)" + n ...
- iPhone、iPad、iPadMini界面设计标准
一个:iPhone 4.0' Display: iPhone 5.iPhone 5S.iPhone 5C. 解析度:1136 * 960 设计标准參照下图iPhone5 3.5' Display: ...
- C# WinForm程序退出的方法(转)
转自:http://www.cnblogs.com/yugen/archive/2010/08/10/1796864.html 1.this.Close(); 只是关闭当前窗口,若不是主窗体的话, ...
- Tabs - 选项卡插件
接上篇Tabs - 选项卡插件 其中12)Yet (E)Another Tab Interface没有依赖任何javascript框架,以作补充 9)Flipping C ...
- Oracle常用函数:DateDiff() 返回两个日期之间的时间间隔自定义函数
首先在oracle中没有datediff()函数可以用以下方法在oracle中实现该函数的功能:1.利用日期间的加减运算天:ROUND(TO_NUMBER(END_DATE - START_DATE) ...
- Linux 宿主机安装 MiniGUI
去MiniGUI官方网站看的时候,很兴奋,安装竟然这么容易. 上帝总是在给你一个苹果之后,赏你一巴掌.我的确是高兴太早了. 首先看一下官网文档的说明步骤: (截取于官方文档) Installing r ...