大家都知道,Trie树(又称字典树)是一种树型数据结构,用于保存大量的字符串。它的优点是:利用字符串的公共前缀来节约存储空间。

相对来说,Trie树是一种比较简单的数据结构,比较易于理解。话说上帝是公平的,简单的东西是要付出相应的代价的!Trie树也有它的缺点,它的内存消耗非常大。下面介绍一个减小内存消耗的小技巧。

我们先看看这个题目:http://acm.sdut.edu.cn/judgeonline/showproblem?problem_id=1500

看看这段程序:

#include <stdio.h>#include <string.h>#include <malloc.h>typedef struct node{int flag;struct node *next[26];}Node;int tmp;Node * NewNode(){int i;    Node * p = (Node *)malloc(sizeof(Node));    p->flag =0;for(i =0; i <26; i++)        p->next[i] =0;return p;}void insert(Node * root, char s[]){int n = strlen(s);int i;    Node * p;    p = root;for(i =0; i < n; i++)    {if(p->next[s[i] -'a'] == NULL)            p->next[s[i] -'a'] = NewNode();        p = p->next[s[i] -'a'];    }    p->flag =1;}void search(Node * root, char s[]){int len = strlen(s);int i;    Node *p;    p = root;for(i =0; i < len; i++)    {if(p->next[s[i] -'a'] != NULL)            p = p->next[s[i] -'a'];    }if(p->flag)    {        p->flag =0;        tmp--;    }}

void change(char s[]){int len, i;    len = strlen(s);for(i =0; i  < len; i++)if(s[i] >='A'&& s[i] <='Z')            s[i] +=32;}int main(){int n, m;char s[11];    Node *root;while(scanf("%d", &n),n)    {        tmp = n;        scanf("%d", &m);        root = NewNode();while(n--)        {            scanf("%s", s);            change(s);            insert(root, s);        }while(m--)        {            scanf("%s", s);            change(s);            search(root, s);        }        printf("%d\n", tmp);    }return0;}

这是一个典型的Trie树程序,AC的结果是:

160138 vongang 1500 Accepted 50376K 312MS GCC

显然,memory很变态!

从上边程序可以看到。root 在while(scanf("%d", &n),n)里边初始化,当一次while(scanf("%d", &n),n)执行完以后,第二次又会给root重新分配空间。这样,原来分配的空间就没有用处了,于是,我们可以在一次程序执行完以后,将root的空间free掉。当然不是简单的free(root),这里需要一个del()函数,代码如下:

void del(Node * p){int i;if(p)                   //p不为空    {for(i =0; i <26; i++)if(p->next[i])                del(p->next[i]);        //递归删除每一个p->next[]    }    free(p);    p = NULL;        }

在while(scanf("%d", &n),n){}的最后调用del()函数可以大大减小内存消耗, AC结果:

160137 vongang 1500 Accepted 12680K 500MS GCC

memory从5W缩小到1W多,当然,时间有所增加,这也算是del()函数的一点缺陷吧。另为,此方法只适用于动态分配存储空间!

作者:VonGang

转载请注明:http://www.cnblogs.com/vongang/

转载于:https://www.cnblogs.com/vongang/archive/2011/07/31/2122891.html

Trie 树内存消耗问题相关推荐

  1. 字符串匹配算法 -- AC自动机 基于Trie树的高效的敏感词过滤算法

    文章目录 1. 算法背景 2. AC自动机实现原理 2.1 构建失败指针 2.2 依赖失败指针过滤敏感词 3. 复杂度及完整代码 1. 算法背景 之前介绍过单模式串匹配的高效算法:BM和KMP 以及 ...

  2. 总结下各种常见树形结构的定义及特点(二叉树、AVL树、红黑树、Trie树、B树、B+树)

    文章目录 前言 一棵普通的树 相关术语 二叉树 二叉树性质 二叉树特例 二叉查找树 AVL树 特点及应用 红黑树 特点 应用 Trie树 特点及应用 B树 定义及特点 应用 B+树 B+树的优势及应用 ...

  3. 字符串匹配数据结构 --Trie树 高效实现搜索词提示 / IDE自动补全

    文章目录 1. 算法背景 2. Trie 树实现原理 2.1 Trie 树的构建 2.2 Trie树的查找 2.3 Trie树的遍历 2.4 Trie树的时间/空间复杂度 2.5 Trie 树 Vs ...

  4. Trie 树——搜索关键词提示

    当你在搜索引擎中输入想要搜索的一部分内容时,搜索引擎就会自动弹出下拉框,里面是各种关键词提示,这个功能是怎么实现的呢?其实底层最基本的就是 Trie 树这种数据结构. 1. 什么是 "Tri ...

  5. 数据结构之Trie树

    1. 概述 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. Trie一词来自retrieve,发音为/tr ...

  6. Trie 树——搜索关键词提示 1

    当你在搜索引擎中输入想要搜索的一部分内容时,搜索引擎就会自动弹出下拉框,里面是各种关键词提示,这个功能是怎么实现的呢?其实底层最基本的就是 Trie 树这种数据结构. 1. 什么是 "Tri ...

  7. 各种树:trie树、B树、B-树、B+树、B*树

    红黑树rbtree 二叉排序树 map 就是采用红黑树存储的,红黑树(RB Tree)是平衡二叉树,其优点就是树到叶子节点深度一致,查找的效率也就一样,为logN.在实行查找,插入,删除的效率都一致, ...

  8. Trie树:应用于统计和排序

    1. 什么是trie树 1.Trie树 (特例结构树)       Trie树,又称单词查找树.字典树,是一种树形结构,是一种哈希树的变种,是一种用于快速检索的多叉树结构.典型应用是用于统计和排序大量 ...

  9. 浅谈 trie树 及其实现

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

最新文章

  1. delphi回调函数
  2. python小程序源代码-10个Python练手小程序
  3. DPM2012保护sharepoint场
  4. C# StatusStrip状态栏 例程
  5. 自己动手编写一个ajax extender
  6. 6款html5模板下载
  7. 呆萌的图模型学习——使用networkx计算node2vec,得到节点与边的embedding(三)
  8. 条款三 : 操作符is或as优于强制转型
  9. Zemax—波长1550nm不在所选玻璃色散公式的有效范围内
  10. Mysql驱动程序是什么?
  11. 一文看懂摄像头测距技术
  12. 2021-09-02
  13. 计算机开机发出长滴,在电脑开机时滴的一声,怎么去掉
  14. oracle存储多少条数据类型,Oracle目前可以存储极大的对象,这是因为它引入了四种新的数据类型。其中哪一种大对象数据类型在数...
  15. Android社招面经分享!2021华为Android高级面试题及答案,附相关架构及资料
  16. 将遗传算法(GA)应用于指定的函数 f(x) = x*sin(x)+1,x∈[0, 2л],求其最大值和最小值
  17. 《比特彗星-教程》(编辑于2023.02.08)
  18. 数据及数据管理基本概念
  19. 网页制作初级教程学习资料
  20. Python开源游戏推荐,《帝国时代2》

热门文章

  1. 仿iReader-按menu键弹出PopupWindow布局界面
  2. mysql8 index255_详解关于MySQL 8.0走过的坑
  3. Java日志框架之JUL(java util logging)详解
  4. 变分法和变分贝叶斯推断
  5. Python机器学习:线型回归法008实现多元线性回归
  6. mysql xp cmdshell_LOAD语句:利用MSSQL中的xp_cmdshell功能,将指定文件夹下的指定文件,生成mysql的LOAD语句...
  7. 用诗歌描写计算机课,小班诗歌公开课教案范文【3篇】
  8. lenovoT430win8下重装win7系统
  9. 常州工学院计算机毕业论文多少字,研究常州工学院毕业论文(设计)系统快速使用指南.doc...
  10. c语言程序设计基础广西师范大学漓江学院,广西师范大学漓江学院试卷-计算机基础A方案.doc...