哈夫曼编码信息论课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
信
息
论
课
程
设
计
实
验
报
告
专业班级:信计0802
姓名:刘建勋
学号:07
目录:
1.课题描述-----------------------------------------------------------------------------------------3
2.信源编码的相关介绍---------------------------------------------------------------------3
3.哈夫曼编码-------------------------------------------------------------------------------------3
哈夫曼编码算法-----------------------------------------------------------------------3
哈弗曼编码的特点--------------------------------------------------------------------4
哈夫曼实验原理----------------------------------------------------------------------- 4 4.哈夫曼编码的C++实现-----------------------------------------------------------------5
程序设计-----------------------------------------------------------------------------------5
运行结果-----------------------------------------------------------------------------------8 总结-----------------------------------------------------------------------------------------------------8 参考文献-------------------------------------------------------------------------------------------------8
1.课题描述
实验类别:
设计性实验
实验目的:
掌握哈夫曼编码原理;
了解哈夫曼码的最佳性;
实验内容:
编程实现二元huffman编码;
2.信源编码的相关介绍:
信源编码的基础是信息论中的两个编码定理:无失真编码定理和限失真编码定理,前者是可逆编码定理的基础。可逆是指当信源符号转换成代码后,可从代码无失真的恢复信源符号。当已知信源符号的概率特性时,可计算它的符号熵,这表示每个信源符号所载的信息量。编码定理不仅证明了必定存在一种编码方法,可是代码的平均长度可任意接近但不低于符号熵,而且还阐明达到这目标的途径,这就是使概率和码长相匹配。无失真编码和可逆编码只适用于离散信源。对于连续信源,编程代码后就无法无失真的恢复原来的连续值,因为后者的取值可有无限多个。此时只能根据率失真编码定理在失真受限制的情况下进行限失真编码。信源编码定理出现以后,编码方法就趋于合理化。
3.哈夫曼编码:
哈夫曼编码算法:
递归算法
void HFMCoding(Tree &HFMnode, HFMCode, int *m2, int n) {
int i, j, m1, m2 ,x1, x2, Init;
char *cd;
unsigned int c, f;
if (n<=1) return;
m1 = 2 * n - 1;
HFMnode = (Tree)malloc((m+1) * sizeof(HTNode));
for (i=1; i<=n; i++) { robability=m2[i-1];
HFMnode [i].parent=0;
HFMnode [i].lchild=0;
HFMnode [i].rchild=0;
}
for (i=n+1; i<=m; i++) { robability=0;
HFMnode [i].parent=-1;
HFMnode [i].lchild=-1;
HFMnode [i].rchild=-1; }
printf("\n哈夫曼树的构造过程如下所示:\n");
printf("HT初态:\n 结点 probability parent lchild rchild");
for (i=1; i<=m; i++)
printf("\n%f%f%f%f%f",i,HT[i]. probability
HFMnode [i].parent, HFMnode[i].lchild, HFMnode [i].rchild);
getch();
for (i=n+1; i<=m; i++) { arent = i; HFMnode [x2].parent = i;
HFMnode [i].lchild = x1; HFMnode [i].rchild = x2;
HFMnode [i]. probability = HFMnode [x1]. probability+ HFMnode [x2]. probability; printf("\nselect: x1=%f x2=%f\n", x1, x2);
printf(" 结点 probability parent lchild rchild");
for (j=1; j<=i; j++)
printf("\n%f%f%f%f%f",j,HT[j]. probability t,
HT[j].parent,HT[j].lchild, HT[j].rchild);
}
cd = (char *)malloc(n*sizeof(char)); arent; f!=0; c=f, f=probability [f].parent)