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 译文: 使 ...
随机推荐
- 2299 Ultra-QuickSort(归并)
合并排序第一次.连环画看着合并看着别人的博客的想法. http://poj.org/problem? id=2299 #include <stdio.h> #include <std ...
- SoC嵌入式软件架构设计II:否MMU的CPU虚拟内存管理的设计与实现方法
大多数的程序代码是必要的时,它可以被加载到内存中运行.手术后,可直接丢弃或覆盖其他代码.我们PC然在同一时间大量的应用,能够整个线性地址空间(除了部分留给操作系统或者预留它用),能够觉得每一个应用程序 ...
- JS判断Array数组中是否包含指定元素
1.调用方式: var arr=["a","b"]; alert(arr.in_array("a")) 2.JS判断数组是否包含指定元素方法 ...
- JS操作cookie的实例
<script type="text/javascript"> //写cookies函数 function SetCookie(name, value)//两个参数,一 ...
- MySql状态查看方法 MySql如何查看连接数和状态?
原文:MySql状态查看方法 MySql如何查看连接数和状态? 如果是root帐号,你能看到所有用户的当前连接.如果是其它普通帐号,只能看到自己占用的连接 怎么进入mysql命令行呢? mysql的安 ...
- Cocos2d-x 2.3.3版本 FlappyBird
Cocos2d-x 2.3.3版本 FlappyBird 本篇博客基于Cocos2d-x 2.3.3, 介绍怎样开发一款之前非常火的一款游戏FlappyBird.本篇博客内容大纲例如以下: 1 ...
- hdu4417 Super Mario 树阵离线/划分树
http://acm.hdu.edu.cn/showproblem.php?pid=4417 Super Mario Time Limit: 2000/1000 MS (Java/Others) ...
- Spring Resource之应用上下文和资源路径
1.构建应用上下文 一个应用上下文构造器一般需要一个构成Bean定义的上下为你xml字符串路径或者一个字符串数组路径作为参数. 当这样的路径没有前缀的时候,那么从哪个路径构建的资源类型,用于加载bea ...
- Java开发工具IntelliJ IDEA使用教程:创建新的Andriod项目
IntelliJ IDEA社区版作为一个轻量级的Java开发IDE,本身是一个开箱即用的Android开发工具. 注意:在本次的教程中我们将以Android平台2.2为例进行IntelliJ IDEA ...
- OpenCV2第一个马拉松8环——画一个柱状图
在包里 灰度直方图 彩色直方图 葵花宝典 直方图的理论还是非常丰富的,应用也非常多,诸如: 直方图均衡化 直方图匹配(meanshift,camshift) 在这里,我先介绍基础.怎样绘制图像的直方图 ...