算法源码之哈弗曼编码
来源:互联网 发布:mac os10.11正式版镜像 编辑:程序博客网 时间:2024/05/05 10:48
本文没有论述哈弗曼编码的原理、过程。只是将其实现过程现于纸上,为更多朋友在紧急的时候提供方便。忘广大朋友提出批评与指正,后续将不断撰写常用的算法源码
#include<stdio.h>#include<stdlib.h>#define MAXVALUE 10typedef struct HTNode{ float weight; //结点权重 int parent; //当前结点的父节点 int LChild; //当前结点的左子节点 int RChild; //当前结点的右子节点}HTNode;void select(HTNode hTree[],int n,int *s1,int *s2){//选择较小的两个结点,这里将s1和s2的地址传递过去 int i,j; float min1,min2; min1=min2=MAXVALUE;//要找两个较小的数 for(i=0;i<n;i++){ //在树中找最小结点 if(min1>hTree[i].weight&&hTree[i].parent==-1){//注意判断条件,hTree[i].parent==-1表示该节点还未被选过 *s1=i; } } for(j=0;j<n;j++){ //在树中找次最小结点 if(min2>hTree[j].weight&&hTree[j].parent==-1&&(*s1)!=j){ *s2=j; } }}void crtHuffmanTree(HTNode hTree[],float p[],int r){//创建哈弗曼树 int i,s1,s2,m; m=2*r-1;//有r个叶子结点,当整棵树构建完毕时,结点总数为m个 for(i=0;i<r;i++){ //哈弗曼树的初态 hTree[i].weight=p[i]; hTree[i].LChild=-1; hTree[i].parent=-1; hTree[i].RChild=-1; } for(i=r;i<m;i++){ select(hTree,i-1,&s1,&s2);//在树中找两个权值最小的,将下标值赋给s1,s2; hTree[i].weight=hTree[s1].weight+hTree[s2].weight; hTree[s1].parent=i; hTree[s2].parent=i; hTree[i].LChild=s1; hTree[i].RChild=s2; hTree[i].parent=-1; } for(i=0;i<m;i++){ printf("%lf \n",hTree[i].weight); } printf("创建哈弗曼树完毕\n");}void main(){ HTNode hTree[2*4-1] ;//测试,假设有4个节点 float p[4]={2.00/5.00,1.00/5.00,1.00/5.00,1.00/5.00};//分别是这四个结点的权重 crtHuffmanTree(hTree,p,4);}
- 算法源码之哈弗曼编码
- 哈夫曼编码算法源码
- Base64编码算法(Basic编码)之iharder算法源码解析
- 算法之赫夫曼编码
- 编码算法之指数哥伦布编码
- 编码算法之指数哥伦布编码
- 算法源码之单链表逆置
- 遗传算法之:编码方法
- 贪心算法之哈夫曼编码
- 遗传算法之:编码方法
- 算法导论之--------------Huffman编码
- 贪心算法之赫夫曼编码
- 算法导论之哈夫曼编码
- 贪心算法之Huffman编码
- 遗传算法之:编码方法
- 贪心算法之哈夫曼编码
- 遗传算法之二进制编码
- 压缩算法之算术编码
- Linux (RHEL 5)下安装 Oracle 10g R2
- Qt入门-设置启动时界面出现在屏幕的中央
- 安装IntelHaxm出现报错的问题
- 流程汇总(虚拟机--网络-samba服务器-sshd连接)
- 一道经典的面试题:如何从N个数中选出最大(小)的n个数?
- 算法源码之哈弗曼编码
- socket编程,客户端的实现
- javascript学习笔记—数组和字符串的使用技巧
- FFmpeg vc 入门
- HTTP协议规范的get和post对传递的参数的最大长度没有限制
- Android应用开发中的风格和主题(style,themes)
- 面试题系列——易错易忽略小题
- Generation of a LOT number for an Inventory item via API in R12
- 心情随笔3