浅谈 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树 前言 之前写了一篇偏向于理 ...
随机推荐
- 【codeforces 746G】New Roads
[题目链接]:http://codeforces.com/problemset/problem/746/G [题意] 给你3个数字n,t,k; 分别表示一棵树有n个点; 这棵树的深度t,以及叶子节点的 ...
- FastDFS 实现图片上传_01
一.jar 包 jar包下载:https://pan.baidu.com/s/1nwkAHU5 密码:tlv6 或者 下载工程,安装到 maven 本地仓库 工程下载:https://pan.baid ...
- HDU 4165
一块药看成括号配对就行了.很明显的直接求卡特兰数. 今晚看了HDU 3240的题,有一点思路,但无情的TLE.想不到什么好方法了,看了别人的解答,哇...简直是天才的做法啊....留到星期六自己思考一 ...
- 前端防止button被多次点击
前端的部分逻辑有时候控制前端的显示.比方记录收藏数目等等.有时候多次反复点击会造成前端显示的bug.所以须要有部分逻辑推断去筛除掉反复多次的点击. 实现部分代码例如以下,主要是通过setTimeout ...
- Qt Quick Controls 与 Qt Quick Controls 2的区别(详细对照)
Qt Quick Controls 原本是为支持桌面平台而开发的,后来又加入了移动平台和嵌入式平台的支持.它们应用非常广泛,因为它们提供了足够灵活的样式系统,以允许开发具有平台相关或者无关风格的应用程 ...
- javascript系列-class7.Date对象
1.对象 什么是对象? 对象的类型是Object. JavaScript 中的所有事物都是对象:字符串.数值.数组.函数... javaScript中万事万物皆对象 用官方 ...
- BZOJ 2127 二元关系
题意: 思路: 先把所有的值加起来 最小割割哪儿 就代表那个地方不选 一减 剩下的就是 最大值了 //By SiriusRen #include <cstdio> #include < ...
- BZOJ 3160 FFT+Manacher
思路: 这道题思路好奇怪--. 我们先要知道关于x (x可以是间隙) 对称的有几对字母 显然暴力是n^2的 那怎么办呢 先把所有'a'看成1 'b'看成0 意外的发现 这不就是卷积嘛 再倒过来搞一搞 ...
- Spark SQL概念学习系列之Spark SQL概述
很多人一个误区,Spark SQL重点不是在SQL啊,而是在结构化数据处理! Spark SQL结构化数据处理 概要: 01 Spark SQL概述 02 Spark SQL基本原理 03 Spark ...
- SAS小记
2011年8月13日 最近一直在跟着李东风的<统计软件教程>学习SAS,刚刚学完初等统计,感觉还没入门,找不到matlab编程时那种手顺的感觉.继续学习吧,加油! 最近用spss处 ...