Trie 树内存消耗问题
大家都知道,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/
Trie 树内存消耗问题的更多相关文章
- 内存空间有限情况下的词频统计 Trie树 前缀树
数据结构与算法专题--第十二题 Trie树 https://mp.weixin.qq.com/s/nndr2AcECuUatXrxd3MgCg
- #1014 Trie树
本题主要是求构造一棵Trie树,即词典树用于统计单词. C#代码如下: using System; using System.Collections.Generic; using System.Lin ...
- 1014 : Trie树 hihocoder
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. ...
- Trie树
一.什么是trie树 1.Trie树 (特例结构树) Trie树,又称单词查找树.字典树,是一种树形结构,是一种哈希树的变种,是一种用于快速检索的多叉树结构.典型应用是用于统计和排序大量的字符串( ...
- [转]数据结构之Trie树
1. 概述 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. Trie一词来自retrieve,发音为/tr ...
- 浅谈 trie树 及其实现
定义:又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构, 如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. 核心思想:是空间换时间.利用字符串的公共前缀来降低查询时间的开 ...
- Trie树:应用于统计和排序
Trie树:应用于统计和排序 1. 什么是trie树 1.Trie树 (特例结构树) Trie树,又称单词查找树.字典树,是一种树形结构,是一种哈希树的变种,是一种用于快速检索的多叉树结构 ...
- Trie树及其应用
Trie树及其应用 Trie树 Trie树,又称单词查找树.字典树,是一种树形结构,是一种哈希树的变种,是一种用于快速检索的多叉树结构.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经 ...
- Trie树详解
1. 概述 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树.Trie一词来自retrieve,发音为/tri ...
随机推荐
- 一起学android之怎样设置TextView中不同字段的字体颜色(22)
在这里先看看效果图: OK,有时候,在我们的项目中会要求TextView中文本有一部分的字体颜色不一样.这时我们应该使用 SpannableStringBuilder这个工具类,当然这个类的功能非常强 ...
- Codeforces Round #263 (Div. 2) proB
题目: B. Appleman and Card Game time limit per test 1 second memory limit per test 256 megabytes input ...
- Linux相互排斥与同步应用(三):posix线程实现单个生产者和单个消费者模型
[版权声明:尊重原创.转载请保留出处:blog.csdn.net/shallnet 或 .../gentleliu.文章仅供学习交流,请勿用于商业用途] 在第一节说到了 ...
- SSH 使用密钥登录并禁止口令登录
小结:修改下sshd配置文件,把公钥传上去就好了 先生成公钥和私钥,默认在/root/.ssh/目录,可以先看一下有没有这个目录. 生成公钥后,以后其它服务器也都可以复用这个公钥 最好生成时输入密码! ...
- toitorsegit and toitorstsvn文件夹icon冲突不显示
Go to HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer Add a new string value & ...
- 我的Android进阶之旅------>Android实现音乐示波器、均衡器、重低音和音场功能
本实例来自于<疯狂Android讲义>,要实现具体的功能,需要了解以下API: MediaPlayer 媒体播放器 Visualizer 频谱 Equalizer 均衡器 BassBoo ...
- SecureCRT连接VMWare中Linux
SecureCRT连接vmvare虚拟机ubuntu的前提条件1. 使用主机可以ping通虚拟机,或虚拟机可以ping通主机2. 虚拟机已经开启ssh服务,可以使用sudo apt-get i ...
- Pandas一些小技巧
Pandas有一些不频繁使用容易忘记的小技巧 1.将不同Dataframe写在一个Excel的不同Sheet,或添加到已有Excel的不同Sheet(同名Sheet会覆盖) from pandas i ...
- Bootstrap——全局CSS样式
1.栅格系统 containter:用于固定宽度并支持响应式布局的容器 container-fluid:用于100%宽度,占据全部视口(viewport)的容器 row:行,必须在container或 ...
- Java for LeetCode 115 Distinct Subsequences【HARD】
Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence ...