定义:又称字典树,单词查找树或者前缀树,是一种用于高速检索的多叉树结构。

如英文字母的字典树是一个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树 及事实上现的更多相关文章

  1. (转)浅谈trie树

    浅谈Trie树(字典树)         Trie树(字典树) 一.引入 字典是干啥的?查找字的. 字典树自然也是起查找作用的.查找的是啥?单词. 看以下几个题: 1.给出n个单词和m个询问,每次询问 ...

  2. 浅谈 trie树 及其实现

    定义:又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构, 如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. 核心思想:是空间换时间.利用字符串的公共前缀来降低查询时间的开 ...

  3. 浅谈Trie树(字典树)

          Trie树(字典树) 一.引入 字典是干啥的?查找字的. 字典树自然也是起查找作用的.查找的是啥?单词. 看以下几个题: 1.给出n个单词和m个询问,每次询问一个单词,回答这个单词是否在单 ...

  4. [转] 浅谈Trie树(字典树)

    原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/6290732.html Trie树(字典树) 一.引入 字典是干啥的?查找字的. 字典树自然也是起查找 ...

  5. 浅谈Trie树

    Trie树,也叫字典树.顾名思义,它就是一个字典 字典是干什么的?查找单词!(英文字典哦) 个人认为字典树这个名字起得特别好,因为它真的跟字典特别像,一会r你就知道了. 注:trie的中文翻译就是单词 ...

  6. 浅谈B+树索引的分裂优化(转)

    http://www.tamabc.com/article/85038.html 从MySQL Bug#67718浅谈B+树索引的分裂优化   原文链接:http://hedengcheng.com/ ...

  7. 浅谈oracle树状结构层级查询之start with ....connect by prior、level及order by

    浅谈oracle树状结构层级查询 oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的,虽然我是一个java程序开发者,我一直觉得只 ...

  8. 浅谈oracle树状结构层级查询测试数据

    浅谈oracle树状结构层级查询 oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的,虽然我是一个java程序开发者,我一直觉得只 ...

  9. Trie树之C-实现

    title: Trie树之C++实现 comments: true date: 2016-10-02 16:59:54 categories: 算法 tags: Trie树 前言 之前写了一篇偏向于理 ...

随机推荐

  1. libvips

    libvips : an image processing library libvips is a 2D image processing library. Compared tosimilar l ...

  2. C#-入门思维导图

    C#-入门思维导图 百度云盘 链接:http://pan.baidu.com/s/1jI5zMS2 密码:0ypc 如有错误,请告知我

  3. HDU 4035

    dp求期望的题. 设 E[i]表示在结点i处,要走出迷宫所要走的边数的期望.E[1]即为所求. 叶子结点: E[i] = ki*E[1] + ei*0 + (1-ki-ei)*(E[father[i] ...

  4. [Python]threading local 线程局部变量小測试

    概念 有个概念叫做线程局部变量.一般我们对多线程中的全局变量都会加锁处理,这样的变量是共享变量,每一个线程都能够读写变量,为了保持同步我们会做枷锁处理.可是有些变量初始化以后.我们仅仅想让他们在每一个 ...

  5. Apache shiro 笔记整理之编程式授权

    下面内容是在看了涛哥的<跟我一起学shiro> 和 视频<一头扎入进shiro> 后整理出来备忘和方便自己和其它人学习. 个人主页:http://www.itit123.cn/ ...

  6. ZOJ Problem Set - 3820 Building Fire Stations 【树的直径 + 操作 】

    题目:problemId=5374" target="_blank">ZOJ Problem Set - 3820 Building Fire Stations 题 ...

  7. Composer使用实践

    Composer 是 PHP5.3以上 的一个依赖管理工具.它允许你声明项目所依赖的代码库,它会在你的项目中为你安装他们. 地址在这里 库地址 这里相当于php应用商店,存放着很多库. 这些库,基本上 ...

  8. android studio 、 as 如何导入eclipse项目

    安卓项目有两种,一种是eclipse开发的,一种的android studio开发的.有些在github开源的安卓项目,下载下来之后不知道该如何处理了. 这个是Eclipse安卓项目的目录结构. 这个 ...

  9. R和中心度、中心势

    最近用R画论文里的弦图,恰好借的书里着重写了中心度等问题. 网上流行一套密歇根大学社交计算的教程.但是前两年看了好几遍总是搞不清,即便是记公式也是收效不大.不妨按照书上总结一下. 绝对法: 无向图点度 ...

  10. Linux与Windows信息交互快捷方法

    要把windows上的D盘挂载的Linux上,首先要知道windows的用户名和密码 假设用户名是administrator,密码是123456 首先,在linux上创建一个挂载的目标目录 mkdir ...