Trie 树内存消耗问题

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/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/101751.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 大数据与云计算和物联网之间的关系是什么_大数据信息主要安全问题不包括

    大数据与云计算和物联网之间的关系是什么_大数据信息主要安全问题不包括大数据时代的到来,是全球知名咨询公司麦肯锡最早提出的,麦肯锡称:“数据,已经渗透到当今每一个行业和业务职能领域,成为重要的生产因素。人们对于海量数据的挖掘和运用,预示着新一波生产率增长和消费者盈余浪潮的到来。”《互联网进化论》一书中提出“互联网的未来功能和结构将于人类大脑高度相似,也将具备互联网虚拟感觉,虚拟运动,虚拟中枢,虚拟记忆神经系统”,并绘制…

  • 程序员写个人技术博客的价值与意义

    程序员写个人技术博客的价值与意义文章目录什么是博客主要用途博客分类个人博客使用第三方平台个人博客与独立博客的优缺点使用第三方平台个人博客的优点独立博客的优点没写博客的原因浪费时间工作太忙,没时间写懒于思考,疏于总结怕自己的技术被别人学到,被别人超越想写,但不知道写什么技术含量低,写出来没意义,怕别人嘲笑写博客最初的想法写博客的价值与意义加深对技术点的理解,记录足迹,反映成长,分类检索,方便日后查阅观点碰撞,分享收获结交更多志同道…

  • SCM CVS

    SCM CVS

  • intellij idea 控制台中文乱码_idea server控制台乱码

    intellij idea 控制台中文乱码_idea server控制台乱码本人下载了一开源工程,该工程采用的是maven进行编译,在导入到itellijidea后,按如下图配置好maven编译环境但是采用配置好的maven进行编译时,在run的控制台输出窗口中出现乱码,导致无法编译,由于工程是utf-8编码,所以按如下方式配置了工程的编码网上run控制台输出乱码的解决思路如下:1)参照上面配置工程编码的方式将GlobalEncoding/Proj…

  • 数组转集合集合转数组_数组与集合的区别

    数组转集合集合转数组_数组与集合的区别一、数组转集合:String[]array={“1″,”2″,”3″,”4”};List<String>list=Arrays.asList(array);ListarrList=newArrayList(list);arrList.add(“5”);二、集合转数组:…

  • 西门子plc scl语言很少人用_西门子plc的scl语言

    西门子plc scl语言很少人用_西门子plc的scl语言原标题:为什么说SCL将成为西门子PLC的主流编程语言接触S7-1200的时间不是很长,但个人感觉TIAPROTAL中的SCL编程语言还不错,下面是我写的一个传送带的启停程序:bnnyygysaid:我献丑来一个,半成品,给设备改造的,用的欧姆龙CP1L,ST语言功能块,部分节选。wenpiansaid:还是梯形图适合逻辑。ljj977said:程序写的不错。tiaprotal中可以…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号