浅谈 trie树 及事实上现
定义:又称字典树,单词查找树或者前缀树,是一种用于高速检索的多叉树结构。
如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树。
核心思想:是空间换时间.利用字符串的公共前缀来减少查询时间的开销以达到提高效率的目的。
三个基本性质:
1. 根结点不包括字符,除根结点外每个结点都仅仅包括一个字符。
2. 从根结点到某一结点,路径上经过的字符连接起来,为该结点相应的字符串。
3. 每一个结点的全部子结点包括的字符都不同样。
长处:利用字符串的公共前缀来节约存储空间,最大限度地降低无谓的字符串比較,查询效率比哈希表高。
缺点:假设存在大量字符串且这些字符串基本没有公共前缀,则对应的trie树将很消耗内存。
典型应用:统计和排序大量的字符串(但不仅限于字符串)。所以常常被搜索引擎系统用于文本词频统计
至于Trie树的实现。能够用数组。静态分配空间,也能够用指针动态分配
Trie树的操作
在Trie树中主要有3个操作。插入、查找和删除。
普通情况下Trie树中非常少存在删除单独某个结点的情况,因此仅仅考虑删除整棵树。
如果存在字符串str(都为小写字母),Trie树的根结点为root。i=0,p=root。
typedef struct stu
{
int n,flag; //n记录前缀及单词的个数,flag标记单词是否存在
struct stu *next[26]; //子节点
}node;
开辟新节点并初始化:
node* creat_node()
{
node *p=(node *)malloc(sizeof(node));
p->n=p->flag=0;
memset(p->next,0,sizeof(p->next));
return p;
}
1、插入
1)取str[i],推断p->next[str[i]-'a']是否为空,若为空,则建立结点temp,并将p->next[str[i]-'a']指向temp。然后p指向temp。
若不为空,则p=p->next[str[i]-'a'];
2)i++,继续取str[i]。循环1)中的操作,直到遇到结束符'\0'。此时将当前结点p中的 flag 置为true。
插入并统计一个字符串
void trie_insert(node *p,char *s)
{
int i;
while(*s!='\0'){
i=*s-'a';
if(p->next[i]==0)
p->next[i]=creat_node();
p=p->next[i];
s++;
p->n++;
}
p->flag=1;
}
2、查找
1)取str[i],推断推断p->next[str[i]-'a']是否为空。若为空。则返回false。若不为空,则p=p->next[str[i]-'a'],继续取字符。
2)反复1)中的操作直到遇到结束符'\0',若当前结点p不为空而且 flag 为true,则返回true。否则返回false。
查找一个字符串是否存在,并返回其个数:
int trie_search(node *p,char *s)
{
int i;
while(*s!='\0'){
i=*s-'a';
p=p->next[i];
if(p==0)
return 0;
s++;
}
return p->n;
}
3、删除
删除能够以递归的形式进行删除。
递归删除整棵树:
void trie_del(node *root)
{
int i;
for(i=0;i<M;i++) //M为子节点的个数
if(root->next[i]!=NULL)
trie_del(root->next[i]);
free(root);
}
浅谈 trie树 及事实上现的更多相关文章
- (转)浅谈trie树
浅谈Trie树(字典树) Trie树(字典树) 一.引入 字典是干啥的?查找字的. 字典树自然也是起查找作用的.查找的是啥?单词. 看以下几个题: 1.给出n个单词和m个询问,每次询问 ...
- 浅谈 trie树 及其实现
定义:又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构, 如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. 核心思想:是空间换时间.利用字符串的公共前缀来降低查询时间的开 ...
- 浅谈Trie树(字典树)
Trie树(字典树) 一.引入 字典是干啥的?查找字的. 字典树自然也是起查找作用的.查找的是啥?单词. 看以下几个题: 1.给出n个单词和m个询问,每次询问一个单词,回答这个单词是否在单 ...
- [转] 浅谈Trie树(字典树)
原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/6290732.html Trie树(字典树) 一.引入 字典是干啥的?查找字的. 字典树自然也是起查找 ...
- 浅谈Trie树
Trie树,也叫字典树.顾名思义,它就是一个字典 字典是干什么的?查找单词!(英文字典哦) 个人认为字典树这个名字起得特别好,因为它真的跟字典特别像,一会r你就知道了. 注:trie的中文翻译就是单词 ...
- 浅谈B+树索引的分裂优化(转)
http://www.tamabc.com/article/85038.html 从MySQL Bug#67718浅谈B+树索引的分裂优化 原文链接:http://hedengcheng.com/ ...
- 浅谈oracle树状结构层级查询之start with ....connect by prior、level及order by
浅谈oracle树状结构层级查询 oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的,虽然我是一个java程序开发者,我一直觉得只 ...
- 浅谈oracle树状结构层级查询测试数据
浅谈oracle树状结构层级查询 oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的,虽然我是一个java程序开发者,我一直觉得只 ...
- Trie树之C-实现
title: Trie树之C++实现 comments: true date: 2016-10-02 16:59:54 categories: 算法 tags: Trie树 前言 之前写了一篇偏向于理 ...
随机推荐
- Mybatis之MySql批量insert后返回主键
需求:使用批量插入后,需要insert之后的每一条记录的ID 注意:Mybatis3.3.1的版本以后支持批量插入后返回主键ID 示例: domin.java: public class User { ...
- Javascript 实现锚点(Anchor)间平滑跳转
(function($){ $.fn.scroller = function(options){ var defaultVal = { duration: }; var obj = $.extend( ...
- COGS——T 2342. [SCOI2007]kshort || BZOJ——T 1073
http://www.cogs.pro/cogs/problem/problem.php?pid=2342 ★★☆ 输入文件:bzoj_1073.in 输出文件:bzoj_1073.out ...
- 洛谷 P2111 考场奇遇
P2111 考场奇遇 题目背景 本市的某神校里有一个学霸,他的名字叫小明(为了保护主人公的隐私,他的名字都用“小明”代替).在这次的期中考试中,小明同学走桃花运,在考场上认识了一位女生,她的名字叫小红 ...
- UltraEdit正則表達式介绍及实例
前几天,有个将Excel中的数据导入到数据库中的需求.原本想到用程序读取Excel中的数据并存储到数据库中,但经一哥们的提醒,说用 EditPlus或UltraEdit这种工具直接将数据拼凑成SQL插 ...
- Tokyo Tyrant(TTServer)系列(二)-启动參数和配置
启动參数介绍 ttserver命令能够启动一个数据库实例.由于数据库已经实现了Tokyo Cabinet的抽象API,所以能够在启动的时候指定数据库的配置类型. 支持的数据库类型有: ...
- poj3061 Subsequence ,尺取法
A sequence of N positive integers (10 < N < 100 000), each of them less than or equal 10000, a ...
- VC 下加载 JPG / JPEG / GIF / PNG 图片最简单的方法
VC MFC 提供的 API LoadBitmap / LoadImage 类 CBitmap 等都只能操作 BMP 位图,图标.对于其他常用的 JPG / JPEG / GIF / PNG 格式,它 ...
- Codeforces 659F Polycarp and Hay 并查集
链接 Codeforces 659F Polycarp and Hay 题意 一个矩阵,减小一些数字的大小使得构成一个连通块的和恰好等于k,要求连通块中至少保持一个不变 思路 将数值从小到大排序,按顺 ...
- EL与JSTL学习(二)——JSTL技术
1.JSTL概述 JSTL(JSP Standard Tag Library),JSP标准标签库,可以嵌入在jsp页面中使用标签的形式完成业务逻辑等功能. jstl出现的目的同el一样也是要代替jsp ...