dot实现HuffmanTree动态可视化
来源:互联网 发布:淘宝扣分12分会怎么样 编辑:程序博客网 时间:2024/04/30 10:28
代码:
#include<stdio.h>#include<string.h>#include<math.h>#include<stdlib.h>#include<vector>#include<queue>#include<stack>#include<iostream>#include<string>#include<algorithm>using namespace std;#define MaxSize 10005#define inf 0x3f3f3f3ftypedef int KeyType;struct node{ KeyType weight; int lchild,rchild,parent; char code[MaxSize/2]; node() { weight=0; parent=-1; lchild=-1; rchild=-1; }} arr[MaxSize*2];void dot_locate(int num,int times, int addition,int a, int b){ FILE *fp=fopen("HuffmanTree.dot","w+"); fprintf(fp,"digraph HuffmanTree{\n"); fprintf(fp,"fontname=\"Microsoft YaHei\";\n"); fprintf(fp,"label=\"[Huffman Tree]\\n\\n\\n\";\n"); fprintf(fp,"labelloc=t;\n"); fprintf(fp,"labeljust=l;\n"); for(int i=0; i<num+addition; i++) { if(arr[i].parent!=-1&&arr[i].lchild==-1)//叶子节点(左右儿子共存亡) { fprintf(fp,"node%d[fontname=\"Microsoft YaHei\",label=\"|{weight:%d|code:%s}|\",fontcolor=black,color=yellow,shape=record];\n",i,arr[i].weight,arr[i].code); } else if(arr[i].parent==-1&&arr[i].lchild==-1)//不在哈夫曼树中 { if(i==a||i==b) fprintf(fp,"node%d[fontname=\"Microsoft YaHei\",label=\"|weight:%d|\",shape=record,style=filled,color=lightblue];\n",i,arr[i].weight); else fprintf(fp,"node%d[fontname=\"Microsoft YaHei\",label=\"|weight:%d|\",shape=record];\n",i,arr[i].weight); } else if(arr[i].parent==-1&&arr[i].lchild!=-1)//头节点 { if(i==a||i==b) fprintf(fp,"node%d[fontname=\"Microsoft YaHei\",label=\"|weight:%d|\",shape=record,style=filled,color=lightblue];\n",i,arr[i].weight); else fprintf(fp,"node%d[fontname=\"Microsoft YaHei\",label=\"|weight:%d|\",shape=record];\n",i,arr[i].weight); fprintf(fp,"node%d:sw->node%d:n[label=0]\n",i,arr[i].lchild); fprintf(fp,"node%d:se->node%d:n[label=1]\n",i,arr[i].rchild); } else //哈夫曼树中的非叶子结点 { fprintf(fp,"node%d[fontname=\"Microsoft YaHei\",label=\"|weight:%d|\",shape=record];\n",i,arr[i].weight); fprintf(fp,"node%d:sw->node%d:n[label=0]\n",i,arr[i].lchild); fprintf(fp,"node%d:se->node%d:n[label=1]\n",i,arr[i].rchild); } } fprintf(fp,"table[shape=record,fontname=\"Microsoft YaHei\",label=\"{Leaf or not|Node Weight|Code}"); for(int i=0; i<num+addition; i++) { fprintf(fp,"|{%s|%d|%s}",(arr[i].parent!=-1&&arr[i].lchild==-1)?"YES":"NO",arr[i].weight,arr[i].code[0]=='\0'?"NULL":arr[i].code); } fprintf(fp,"\"];\n"); fprintf(fp,"}"); fclose(fp); system("dot.exe -Tpng HuffmanTree.dot -o HuffmanTree.png && HuffmanTree.png");}void dot_build(int num, int times, int addition, int Cal_times, int a, int b){ FILE *fp=fopen("HuffmanTree.dot","w+"); fprintf(fp,"digraph HuffmanTree{\n"); fprintf(fp,"fontname=\"Microsoft YaHei\";\n"); if(times!=Cal_times) fprintf(fp,"label=\"[Huffman Tree]\\n\\ncurrent operation times = %d\\n\\n\";\n",times); else { int ans=0; fprintf(fp,"label=\"[Huffman Tree]\\n\\ncurrent operation times = %d\\n\\nWPL=",times); for(int i=0; i<num; i++) { if(i!=0) fprintf(fp,"+"); fprintf(fp,"%d*%d",arr[i].weight,strlen(arr[i].code)); ans+=arr[i].weight*strlen(arr[i].code); } fprintf(fp,"=%d\";\n",ans); } fprintf(fp,"labelloc=t;\n"); fprintf(fp,"labeljust=l;\n"); for(int i=0; i<num+addition; i++) { if(arr[i].parent!=-1&&arr[i].lchild==-1)//叶子节点(左右儿子共存亡) { if(i==a||i==b) fprintf(fp,"node%d[fontname=\"Microsoft YaHei\",label=\"|{weight:%d|code:%s}|\",color=lightblue,style=filled,shape=record];\n",i,arr[i].weight,arr[i].code); else fprintf(fp,"node%d[fontname=\"Microsoft YaHei\",label=\"|{weight:%d|code:%s}|\",fontcolor=black,color=yellow,shape=record];\n",i,arr[i].weight,arr[i].code); } else if(arr[i].parent==-1&&arr[i].lchild==-1)//不在哈夫曼树中 { fprintf(fp,"node%d[fontname=\"Microsoft YaHei\",label=\"|weight:%d|\",shape=record];\n",i,arr[i].weight); } else if(arr[i].parent==-1&&arr[i].lchild!=-1)//头节点 { fprintf(fp,"node%d[fontname=\"Microsoft YaHei\",label=\"|weight:%d|\",shape=record];\n",i,arr[i].weight); fprintf(fp,"node%d:sw->node%d:n[label=0]\n",i,arr[i].lchild); fprintf(fp,"node%d:se->node%d:n[label=1]\n",i,arr[i].rchild); } else //哈夫曼树中的非叶子结点 { if(i==a||i==b) fprintf(fp,"node%d[fontname=\"Microsoft YaHei\",label=\"|weight:%d|\",color=lightblue,style=filled,shape=record];\n",i,arr[i].weight); else fprintf(fp,"node%d[fontname=\"Microsoft YaHei\",label=\"|weight:%d|\",shape=record];\n",i,arr[i].weight); fprintf(fp,"node%d:sw->node%d:n[label=0]\n",i,arr[i].lchild); fprintf(fp,"node%d:se->node%d:n[label=1]\n",i,arr[i].rchild); } } fprintf(fp,"table[shape=record,fontname=\"Microsoft YaHei\",label=\"{Leaf or not|Node Weight|Code}"); for(int i=0; i<num+addition; i++) { fprintf(fp,"|{%s|%d|%s}",(arr[i].parent!=-1&&arr[i].lchild==-1)?"YES":"NO",arr[i].weight,arr[i].code[0]=='\0'?"NULL":arr[i].code); } fprintf(fp,"\"];\n"); fprintf(fp,"}"); fclose(fp); system("dot.exe -Tpng HuffmanTree.dot -o HuffmanTree.png && HuffmanTree.png");}void dot_standard_build(int num, int times, int addition, int Cal_times){ FILE *fp=fopen("HuffmanTree.dot","w+"); fprintf(fp,"digraph HuffmanTree{\n"); fprintf(fp,"fontname=\"Microsoft YaHei\";\n"); if(times==0) fprintf(fp,"label=\"[Huffman Tree]\\n\\nInitial Data:\";\n"); else { int ans=0; fprintf(fp,"label=\"[Huffman Tree]\\n\\nThe End\\n\\nWPL="); for(int i=0; i<num; i++) { if(i!=0) fprintf(fp,"+"); fprintf(fp,"%d*%d",arr[i].weight,strlen(arr[i].code)); ans+=arr[i].weight*strlen(arr[i].code); } fprintf(fp,"=%d\";\n",ans); } fprintf(fp,"labelloc=t;\n"); fprintf(fp,"labeljust=l;\n"); for(int i=0; i<num+addition; i++) { if(arr[i].parent!=-1&&arr[i].lchild==-1)//叶子节点(左右儿子共存亡) { fprintf(fp,"node%d[fontname=\"Microsoft YaHei\",label=\"|{weight:%d|code:%s}|\",fontcolor=black,color=yellow,shape=record];\n",i,arr[i].weight,arr[i].code); } else if(arr[i].parent==-1&&arr[i].lchild==-1)//不在哈夫曼树中 { fprintf(fp,"node%d[fontname=\"Microsoft YaHei\",label=\"|weight:%d|\",shape=record];\n",i,arr[i].weight); } else if(arr[i].parent==-1&&arr[i].lchild!=-1)//头节点 { fprintf(fp,"node%d[fontname=\"Microsoft YaHei\",label=\"|weight:%d|\",shape=record];\n",i,arr[i].weight); fprintf(fp,"node%d:sw->node%d:n[label=0]\n",i,arr[i].lchild); fprintf(fp,"node%d:se->node%d:n[label=1]\n",i,arr[i].rchild); } else //哈夫曼树中的非叶子结点 { fprintf(fp,"node%d[fontname=\"Microsoft YaHei\",label=\"|weight:%d|\",shape=record];\n",i,arr[i].weight); fprintf(fp,"node%d:sw->node%d:n[label=0]\n",i,arr[i].lchild); fprintf(fp,"node%d:se->node%d:n[label=1]\n",i,arr[i].rchild); } } fprintf(fp,"table[shape=record,fontname=\"Microsoft YaHei\",label=\"{Leaf or not|Node Weight|Code}"); for(int i=0; i<num+addition; i++) { fprintf(fp,"|{%s|%d|%s}",(arr[i].parent!=-1&&arr[i].lchild==-1)?"YES":"NO",arr[i].weight,arr[i].code[0]=='\0'?"NULL":arr[i].code); } fprintf(fp,"\"];\n"); fprintf(fp,"}"); fclose(fp); system("dot.exe -Tpng HuffmanTree.dot -o HuffmanTree.png && HuffmanTree.png");}void encode_HuffmanTree(int num){ stack<int>code_array; for(int i=0; i<num; i++) { int flag=i; while(arr[flag].parent!=-1) { if(arr[arr[flag].parent].lchild==flag) code_array.push(0); else code_array.push(1); flag=arr[flag].parent; } int cnt=0; while(!code_array.empty()) { arr[i].code[cnt++]=code_array.top()+'0'; code_array.pop(); } }}void build_HuffmanTree(int num){ int Cal_times=num-1; int cnt=0; int l_flag,r_flag; int book[MaxSize*2]; int j=0; dot_standard_build(num,j,cnt,Cal_times); memset(book,0,sizeof(book)); for(j=1; j<=Cal_times; j++) { int lchild_weight=inf; int rchild_weight=inf; for(int i=0; i<num+cnt; i++) { if(book[i]==0&&arr[i].weight<lchild_weight) { lchild_weight=arr[i].weight; l_flag=i; } } book[l_flag]=1; for(int i=0; i<num+cnt; i++) { if(book[i]==0&&arr[i].weight<rchild_weight) { rchild_weight=arr[i].weight; r_flag=i; } } book[r_flag]=1; dot_locate(num,j-1,cnt,l_flag,r_flag); arr[r_flag].parent=num+cnt; arr[l_flag].parent=num+cnt; arr[num+cnt].lchild=l_flag; arr[num+cnt].rchild=r_flag; arr[num+cnt].weight=lchild_weight+rchild_weight; cnt++; encode_HuffmanTree(num); dot_build(num,j,cnt,Cal_times,l_flag,r_flag); } dot_standard_build(num,j-1,cnt,Cal_times);}int input_data(){ int num=0; FILE *fp=fopen("data.txt","r+"); while(fscanf(fp,"%d",&arr[num++])!=EOF); num--; return num;}void output_code(int num){ for(int i=0; i<num; i++) { printf("location:%d weight:",i); cout<<arr[i].weight<<" code:"; puts(arr[i].code); }}int main(){ int data_num; data_num=input_data(); build_HuffmanTree(data_num); //output_code(data_num); return 0;}//FROM CJZ
data.txt:5 29 7 8 14 23 3 11
clean.bat:
del *.odel *.pngdel *.dot
runme.bat:
call clean.batHuffman_Tree.exe data.txt::pause
1 0
- dot实现HuffmanTree动态可视化
- HuffmanTree的实现
- Java实现HuffmanTree
- HuffmanTree
- HuffmanTree
- HuffmanTree
- HuffmanTree
- HUffmanTree
- Java实现哈夫曼树(HuffmanTree)
- 二叉树、HuffmanTree、HuffmanCode的实现
- HuffmanTree的实现及Huffman编码
- Android 实现可视化动态音频柱状图
- HuffmanTree的浅析和在C#中的算法实现
- HuffmanTree的浅析和在C#中的算法实现
- 用html+JavaScript实现傅立叶级数的动态可视化
- php和ajax连接数据库实现动态数据可视化
- web worker+highcharts动态实现可视化数据展示
- [Echarts可视化] 二.php和ajax连接数据库实现动态数据可视化
- spring boot 使用FreeMarker模板
- Java以DOM方式解析生成xml文件或字符串
- 请问腾迅前端高级开发工程师
- android的自定义toolbar
- pool(一)——入门
- dot实现HuffmanTree动态可视化
- dubbo注册服务IP解析异常及IP解析源码分析
- 【BOM操作】JavaScript中的event对象之总结
- iOS 通知中心传值
- POJ 1084(DLX重复覆盖)
- Android入门1 ——系统介绍与框架
- hadoop常见问题及其解决办法
- 基于canvas绘图应用程序图标框架的建立
- 新浪分享授权登录