字典树【附加Free例程】
来源:互联网 发布:淘宝店怎么快速升钻 编辑:程序博客网 时间:2024/06/08 12:44
#include <iostream>#include <string.h>using namespace std;#define points 26struct node;typedef struct node *NumTree;struct node{int count;NumTree N[points];};NumTree init(NumTree T){T=new struct node;int i;for(i=0;i<points;i++){T->N[i]=NULL;}return T;}void Insert(NumTree T,char str[]){NumTree UseNow,s;UseNow=T;int i,len;len=strlen(str);int id;for(i=0;i<len;i++){id=str[i]-'a';if(UseNow->N[id]==NULL){s=new struct node;s->count=1;int j;for(j=0;j<points;j++)s->N[j]=NULL;UseNow->N[id]=s;UseNow=UseNow->N[id];}else{UseNow->N[id]->count++;UseNow=UseNow->N[id];}}}int find(NumTree T,char str[]){int i,id;NumTree P;P=T;int len=strlen(str);for(i=0;i<len;i++){id=str[i]-'a';if(P->N[id]==NULL)return 0;elseP=P->N[id];}return P->count;}void FreeTree(NumTree T){int i;for(i=0;i<points;i++){if(T->N[i]!=NULL){FreeTree(T->N[i]);free(T->N[i]);}elsereturn;}free(T);}int main(){NumTree T=NULL;T=init(T);char str[100];while(gets(str) && str[0]!='\0')Insert(T,str);while(gets(str) && str[0]!='\0'){int sum=0;sum=find(T,str);cout<<sum<<endl;}FreeTree(T);return 0;}
FreeTree例程是我自己写的,没有办法检验,但我觉得根据递归应该把所有树都Free掉了,实际运行并没有出现问题,如果要使用本例程的人建议先检查一下哈!
如果有缺陷请留言指出!感激不尽!
以下是数组实现,思路没有改变,但是省略了Malloc的时间,直接从连续数组单元里提取ROOM。需要注意的是这种情况下Memory数组需要开的很大,不然会WA。
另外数组形式的Free例程有点不对劲···不知道为什么运行不了╮(╯▽╰)╭希望有大神指正!
当字典树超时的时候,用Memory形式存取,会减少一定时间,如果是MLE,那么可以在每一次处理完毕后Free一次字典树(不free的话,经过多次建立,会有一个以26为指数级增长的完全树,好可怕=。=)
#include <iostream> #include <string.h> using namespace std; #define points 26 struct node; typedef struct node *NumTree; struct node { int count; NumTree N[points]; };struct node Memory[100000];int ans=0; NumTree init(NumTree T) { T=&Memory[ans++]; int i; for(i=0;i<points;i++) { T->N[i]=NULL; } return T; } void Insert(NumTree T,char str[]) { NumTree UseNow,s; UseNow=T; int i,len; len=strlen(str); int id; for(i=0;i<len;i++) { id=str[i]-'a'; if(UseNow->N[id]==NULL) { s=&Memory[ans++]; s->count=1; int j; for(j=0;j<points;j++) s->N[j]=NULL; UseNow->N[id]=s; UseNow=UseNow->N[id]; } else { UseNow->N[id]->count++; UseNow=UseNow->N[id]; } } } int find(NumTree T,char str[]) { int i,id; NumTree P; P=T; int len=strlen(str); for(i=0;i<len;i++) { id=str[i]-'a'; if(P->N[id]==NULL) return 0; else P=P->N[id]; } return P->count; } void FreeTree() { int i; for(i=0;i<ans;i++) {free(&Memory[i].N);free(&Memory[i]); }} int main() { NumTree T=NULL; T=init(T); char str[100]; while(gets(str) && str[0]!='\0') Insert(T,str); while(gets(str) && str[0]!='\0') { int sum=0; sum=find(T,str); cout<<sum<<endl; } FreeTree(); return 0; }
0 0
- 字典树【附加Free例程】
- 附加
- 例程
- [RTT例程练习] 3.2 动态内存管理之rt_realloc和free
- free.
- free
- free()
- free
- free
- free
- free
- free()
- free
- free
- free
- free
- free
- free
- jsp与servlet区别
- jsp与servlet之间的参数传递
- linux ftp 自动上传文件脚本
- 正确使用 Volatile 变量
- ecshop会员注册页面的Email修改成非必填项方法
- 字典树【附加Free例程】
- C primer ++ 学习笔记第8篇——C++函数
- java 快排和堆排序
- Android 使用ViewPager实现左右循环滑动图片
- BeagleBone Black的macroSD卡启动及恢复
- jsp <%@ page import="" %>问题
- js获取url一级域名的方法
- Android多媒体- ExifInterface读取图片相关信息
- C++第16周(春)项目1 - 用二进制文件处理学生成绩