第十一周项目1-哈弗曼编码的算法验证(4)
来源:互联网 发布:矢量软件illustrator 编辑:程序博客网 时间:2024/05/06 17:02
/* *Copyright(c) 2015, 烟台大学计算机学院 *All rights reserved. *文件名称:哈弗曼编码的算法验证(4).cpp *作 者:高露 *完成日期:2015年 11月16日 *版 本 号: * *问题描述:哈弗曼编码的算法验证 *输入描述:若干数据 *程序输出:若干数据*/#include <stdio.h>#include <string.h>#define N 50 //叶子结点数#define M 2*N-1 //树中结点总数//哈夫曼树的节点结构类型typedef struct{ char data; //结点值 double weight; //权重 int parent; //双亲结点 int lchild; //左孩子结点 int rchild; //右孩子结点} HTNode;//每个节点哈夫曼编码的结构类型typedef struct{ char cd[N]; //存放哈夫曼码 int start;} HCode;//构造哈夫曼树void CreateHT(HTNode ht[],int n){ int i,k,lnode,rnode; double min1,min2; for (i=0; i<2*n-1; i++) //所有结点的相关域置初值-1 ht[i].parent=ht[i].lchild=ht[i].rchild=-1; for (i=n; i<2*n-1; i++) //构造哈夫曼树 { min1=min2=32767; //lnode和rnode为最小权重的两个结点位置 lnode=rnode=-1; for (k=0; k<=i-1; k++) if (ht[k].parent==-1) //只在尚未构造二叉树的结点中查找 { if (ht[k].weight<min1) { min2=min1; rnode=lnode; min1=ht[k].weight; lnode=k; } else if (ht[k].weight<min2) { min2=ht[k].weight; rnode=k; } } ht[i].weight=ht[lnode].weight+ht[rnode].weight; ht[i].lchild=lnode; ht[i].rchild=rnode; ht[lnode].parent=i; ht[rnode].parent=i; }}//实现哈夫曼编码void CreateHCode(HTNode ht[],HCode hcd[],int n){ int i,f,c; HCode hc; for (i=0; i<n; i++) //根据哈夫曼树求哈夫曼编码 { hc.start=n; c=i; f=ht[i].parent; while (f!=-1) //循序直到树根结点 { if (ht[f].lchild==c) //处理左孩子结点 hc.cd[hc.start--]='0'; else //处理右孩子结点 hc.cd[hc.start--]='1'; c=f; f=ht[f].parent; } hc.start++; //start指向哈夫曼编码最开始字符 hcd[i]=hc; }}//输出哈夫曼编码void DispHCode(HTNode ht[],HCode hcd[],int n){ int i,k; double sum=0,m=0; int j; printf(" 输出哈夫曼编码:\n"); //输出哈夫曼编码 for (i=0; i<n; i++) { j=0; printf(" %c:\t",ht[i].data); for (k=hcd[i].start; k<=n; k++) { printf("%c",hcd[i].cd[k]); j++; } m+=ht[i].weight; sum+=ht[i].weight*j; printf("\n"); } printf("\n 平均长度=%g\n",1.0*sum/m);}int main(){ int n=8,i; //n表示初始字符串的个数 char str[]= {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; double fnum[]= {0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.1}; HTNode ht[M]; HCode hcd[N]; for (i=0; i<n; i++) { ht[i].data=str[i]; ht[i].weight=fnum[i]; } printf("\n"); CreateHT(ht,n); CreateHCode(ht,hcd,n); DispHCode(ht,hcd,n); printf("\n"); return 0;}<span style="font-family:Arial;BACKGROUND-COLOR: #ffffff">运行结果:</span>
<img src="http://img.blog.csdn.net/20151116171236349?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
知识点总结:
<span style="font-family:Arial;BACKGROUND-COLOR: #ffffff">哈弗曼编码的算法实现</span>
0 0
- 第十一周项目1-验证算法(4)哈弗曼编码的算法验证
- 第十一周-项目一 验证算法(4)哈弗曼编码的算法验证
- 第十一周项目1验证算法(哈弗曼编码的算法验证)
- 第十一周项目1-哈弗曼编码的算法验证(4)
- 第十一周项目1(4) 哈弗曼编码的算法验证
- 第十一周项目1 验证算法(4) 哈夫曼编码
- (第十一周项目1)二叉树算法验证(4)哈夫曼编码的算法验证
- 第十一周实践项目1—验证算法(4)哈夫曼编码的算法验证
- 第十一周项目1(4)验证算法 哈夫曼编码的算法验证
- 第十一周项目1-验证算法(4)哈夫曼编码的算法验证
- 第十一周项目1—验证算法(4)哈夫曼编码的算法验证
- 第十一周--项目1 - 二叉树算法验证(4)哈夫曼树编码的算法验证
- 第十一周项目1-验证算法(4)-哈夫曼编码的算法验证
- 第十一周项目1-二叉树算法验证(4) 哈夫曼编码的算法验证
- 第十一周项目1-验证算法(4)-哈夫曼编码的算法验证
- 【第十一周 项目1-验证算法(4)哈夫曼编码的算法验证】
- 第十一周 项目1 :二叉树算法验证(4) 哈夫曼编码的算法验证
- 第十一周项目1验证算法—(4)哈夫曼编码的算法验证
- mac下,svn工程目录改变时,清除svn账号和密码问题
- 【图项目1 - 图基本算法库——第12周】
- 关于Bitmap导致的内存问题
- ResourceBundle和ObjectInputStream、ObjectOutputStream使用详解
- java 使用 mail 发送邮件
- 第十一周项目1-哈弗曼编码的算法验证(4)
- Android 5.1 Gallery2编译报错make: *** No rule to make target `out/target/product/techain6572_wet_l/obj/S
- 矩阵求导(machine learning)
- Android中的Touch事件处理
- UnityTestTool实用解释
- QFileSystemModel
- 程序员如何使用和提高搜索资料的技巧
- 第十二周 项目2 操作用邻接表存储的图
- 第十二周项目1-图基本算法库