信息论与编码课程设计(哈夫曼编码的分析与实现)
信息论与编码课程设计--统计信源熵与哈夫曼编码
信息论与编码课程设计--统计信源熵与哈夫曼编码信息论与编码课程设计信息论与编码课程设计报告设计题目:统计信源熵与哈夫曼编码专业班级学号学生姓名指导教师教师评分2015年 3 月 25 日1信息论与编码课程设计目录一、设计任务与要求...................................................................... ...........................................3 二、设计思路...................................................................... .......................................................3 三、设计流程图...................................................................... (5)四、程序运行及结果...................................................................... ...........................................6 五、心得体会...................................................................... . (8)参考文献...................................................................... (9)附录:源程序...................................................................... .. (10)2信息论与编码课程设计一、设计任务与要求1.1设计目的信息论与编码是信息、通信、电子工程专业的基础,对理论研究和工程应用均有重要的作用。
课程设计-哈夫曼编码的分析和实现
课程设计任务书2010—2011学年第一学期专业:通信工程学号:070110101 姓名:苟孟洛课程设计名称:信息论与编码课程设计设计题目:哈夫曼编码的分析与实现完成期限:自2010 年12月20 日至2010 年12 月26 日共1 周一.设计目的1、深刻理解信源编码的基本思想与目的;2、理解哈夫曼编码方法的基本过程与特点;3、提高综合运用所学理论知识独立分析和解决问题的能力;4、使用MATLAB或其他语言进行编程。
二.设计内容假设已知一个信源的各符号概率,编写适当函数,对其进行哈夫曼编码,得出码字,平均码长和编码效率,总结此编码方法的特点和应用。
三.设计要求1、编写的函数要有通用性;2、信源可以自由选择,符号信源与图像信源均可。
四.设计条件计算机、MATLAB或其他语言环境五、参考资料[1]曹雪虹,张宗橙.信息论与编码.北京:清华大学出版社,2007.[2]王慧琴.数字图像处理.北京:北京邮电大学出版社,2007.指导教师(签字):教研室主任(签字):批准日期:年月日摘要哈夫曼编码(Huffman Coding)是一种编码方式,以哈夫曼树—即最优二叉树,带权路径长度最小的二叉树,经常应用于数据压缩。
在计算机信息处理中,“哈夫曼编码”是一种一致性编码法(又称"熵编码法"),用于数据的无损耗压缩。
这一术语是指使用一张特殊的编码表将源字符(例如某文件中的一个符号)进行编码。
这张编码表的特殊之处在于,它是根据每一个源字符出现的估算概率而建立起来的(出现概率高的字符使用较短的编码,反之出现概率低的则使用较长的编码,这便使编码之后的字符串的平均期望长度降低,从而达到无损压缩数据的目的)。
本课题通过MATLAB编写适当的函数,对一个随机信源进行哈夫曼编码,得出码字,平均码长和编码效率。
从而理解信源编码的基本思想与目的以及哈夫曼编码方法的基本过程与特点,并且提高综合运用所学理论知识独立分析和解决问题的能力。
信息论课程实验报告—哈夫曼编码
*p2 = j;
}
}
void CreateHuffmanTree(HuffmanTree T)
{
int i,p1,p2;
InitHuffmanTree(T);
InputWeight(T);
for(i = n;i < m;i++)
4)依次继续下去,直至信源最后只剩下两个信源符号为止,将这最后两个信源符号分别用二元码符号“0”和“1”表示;
5)然后从最后—级缩减信源开始,进行回溯,就得到各信源符号所对应的码符号序列,即相应的码字。
四、实验目的:
(1)进一步熟悉Huffman编码过程;(2)掌握C语言递归程序的设计和调试技术。以巩固课堂所学编码理论的知识。
#include "stdio.h"
#include "stdlib.h"
#include <float.h>
#include <math.h>
#define n 8
#define m 2*n-1
typedef struct
{
float weight;
int lchild,rchild,parent;
}
}
void InputWeight(HuffmanTree T)
{
float temp[n] = {0.20,0.18,0.17,0.15,0.15,0.05,0.05,0.05};
for(int i = 0;i < n;i++)
T[i].weight = temp[i];
}
课程设计哈夫曼编码
《数据结构》课程设计报告设计题目哈夫曼(Huffman)编译码器学院名称信息工程学院专业班级 13计本1 姓名 hhh学号1312219999目录一、实验题目-哈夫曼(Huffman)编/译码器 ------------------------------二、问题描述-----------------------------------------------三、设计目标-----------------------------------------------四、需求分析-----------------------------------------------五、概要设计-----------------------------------------------1---系统结构图--------------------------------------2--各个模块功能的详细描述------------------------------- 六、详细设计-----------------------------------------------1——详细代码--------------------------------------a)头文件代码--------------------------------------b)主函数代码--------------------------------------2——系统流程图--------------------------------------七、测试分析-----------------------------------------------八、使用说明-----------------------------------------------1、白盒-----------------------------------------------2、黑盒-----------------------------------------------九、课程设计总结----------------------------------------------一、实验题目哈夫曼(Huffman)编/译码器二、问题描述利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。
二进制哈夫曼编码1
课程设计任务书2011—2012学年第一学期专业:通信工程学号:姓名:课程设计名称:信息论与编码课程设计设计题目:二进制哈夫曼编码的分析与实现完成期限:自年月日至年月日共周一.设计目的1、深刻理解信源编码的基本思想与目的;2、理解哈夫曼编码方法的基本过程与特点;3、提高综合运用所学理论知识独立分析和解决问题的能力;4、使用MATLAB或其他语言进行编程。
二.设计内容假设已知一个信源的各符号概率,编写适当函数,对其进行哈夫曼编码,得出二进制码字,平均码长和编码效率,总结此编码方法的特点和应用。
三.设计要求1、编写的函数要有通用性;2、信源可以自由选择,符号信源与图像信源均可。
四.设计条件计算机、MATLAB或其他语言环境五.参考资料[1]曹雪虹,张宗橙.信息论与编码.北京:清华大学出版社,2007.[2]王慧琴.数字图像处理.北京:北京邮电大学出版社,2007.指导教师(签字):教研室主任(签字):批准日期:年月日摘要霍夫曼编码是可变字长编码(VLC)的一种。
Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫作Huffman编码。
它是根据可变长最佳编码定理,应用哈夫曼算法而产生的一种编码方法。
在非均匀符号概率分布的情况下,变长编码总的编码效率要高于等字长编码。
因为具体规定了编码的方法,能使无失真编码的效率非常接近与1,所以在压缩信源信息率的实用设备中,哈夫曼编码还是比较常用的。
本课题利用哈夫曼编码的方法实现了对信源符号的熵、平均码长、传输速率、编码效率等的求解。
关键词:Huffman;可变长编码;信源编码目录1.课题描述 (1)2设计原理 (1)3设计过程 (2)3.1课题介绍 (2)3.1.1 Huffman编码特点 (2)3.1.2 哈夫曼编码方法 (3)3.2设计内容 (3)3.3 设计步骤 (4)4 哈夫曼编码的MATLAB实现 (5)总结 (8)参考文献 (9)1. 课题描述huffman 编码是一种二进制编码的算法,目的是缩小原来的数据,简单的说就是将出现概率较高的符号分配较少的码字,而出现概率大的符号分配较长的码字,这样起到压缩数据的作用。
c哈夫曼编码课程设计
c 哈夫曼编码课程设计一、课程目标知识目标:1. 学生能理解哈夫曼编码的基本原理,掌握其构建过程和应用场景。
2. 学生能运用哈夫曼编码进行数据压缩,并了解压缩比的概念。
3. 学生能理解哈夫曼编码在通信、图像处理等领域的重要性。
技能目标:1. 学生能够运用所学知识,独立构建哈夫曼树并进行编码。
2. 学生能够分析给定数据,选择合适的编码方法进行数据压缩。
3. 学生能够运用编程工具实现哈夫曼编码和解码过程。
情感态度价值观目标:1. 学生通过学习哈夫曼编码,培养对数据压缩技术的兴趣,提高信息素养。
2. 学生在合作学习过程中,培养团队协作能力和沟通能力。
3. 学生了解我国在数据压缩领域的研究成果,增强民族自豪感。
课程性质:本课程为信息技术课程,旨在帮助学生掌握数据压缩的基本方法,提高数据处理能力。
学生特点:学生处于高年级阶段,具备一定的编程基础和逻辑思维能力。
教学要求:结合学生特点和课程性质,注重理论与实践相结合,培养学生的实际操作能力和创新能力。
通过分解课程目标为具体学习成果,使学生在学习过程中能够明确自身的学习进度和目标。
二、教学内容1. 哈夫曼编码基本原理:介绍哈夫曼编码的概念、原理和优势,结合教材相关章节,使学生理解哈夫曼编码在数据压缩中的应用。
- 哈夫曼树的构建方法- 哈夫曼编码的生成过程- 压缩比的概念及其计算方法2. 哈夫曼编码的实际操作:通过实际操作,让学生掌握哈夫曼编码的构建和编码过程。
- 利用编程工具实现哈夫曼树的构建- 编程实现哈夫曼编码的生成- 数据压缩与解压缩的实际操作3. 哈夫曼编码的应用案例分析:结合教材案例,分析哈夫曼编码在通信、图像处理等领域的作用。
- 通信领域的数据压缩- 图像处理中的哈夫曼编码应用- 其他领域中的应用案例4. 编程实践:布置相关编程任务,巩固学生对哈夫曼编码的理解和应用。
- 实现哈夫曼编码的压缩和解压缩程序- 分析不同数据集的压缩效果,优化哈夫曼编码方法教学内容安排和进度:第1课时:哈夫曼编码基本原理及构建方法第2课时:哈夫曼编码的实际操作(构建哈夫曼树、生成编码)第3课时:哈夫曼编码的应用案例分析第4课时:编程实践(实现压缩与解压缩程序,优化编码方法)三、教学方法本课程将采用以下教学方法,以促进学生的主动参与和深入理解:1. 讲授法:对于哈夫曼编码的基本原理和概念,通过教师清晰的讲解,结合教材内容,使学生快速掌握理论基础。
哈夫曼编码译码的设计与实现数据结构课程设计
《数据结构》课程设计题目--哈夫曼编码/译码的设计与实现班级:13数据库一班学号:1315925280姓名:吴松指导教师:王超目录目录 (1)一、需求分析 (2)二、设计要求 (2)三、概要设计 (2)1、流程图 (2)2、设计包含的几个部分 (4)四、详细设计 (2)五、显示结果………………………………………………9.六、心得体会 (10)七、参考文献 (11)哈夫曼编码译码一、需求分析在当今信息爆炸时代,如何采用有效的数据压缩技术节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视,赫夫曼编码正是一种应用广泛且非常有效的数据压缩技术。
哈夫曼编码是一种编码方式,以哈夫曼树—即最优二叉树,带权路径长度最小的二叉树,经常应用于数据压缩。
哈弗曼编码使用一张特殊的编码表将源字符(例如某文件中的一个符号)进行编码。
这张编码表的特殊之处在于,它是根据每一个源字符出现的估算概率而建立起来的(出现概率高的字符使用较短的编码,反之出现概率低的则使用较长的编码,这便使编码之后的字符串的平均期望长度降低,从而达到无损压缩数据的目的)。
赫夫曼编码的应用很广泛,利用赫夫曼树求得的用于通信的二进制编码称为赫夫曼编码。
树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1”的序列作为和各个叶子对应的字符的编码,这就是赫夫曼编码。
哈弗曼译码输入字符串可以把它编译成二进制代码,输入二进制代码时可以编译成字符串。
二、设计要求对输入的一串电文字符实现赫夫曼编码,再对赫夫曼编码生成的代码串进行译码,输出电文字符串。
通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。
电报通信是传递文字的二进制码形式的字符串。
但在信息传递时,总希望总长度能尽可能短,即采用最短码。
假设每种字符在电文中出现的次数为Wi,编码长度为Li,电文中有n种字符,则电文编码总长度为∑WiLi。
哈夫曼编码课程设计
中南林业科技大学本科课程设计说明书学院:理学院专业年级:08信息与计算科学课程:信息论与编码课程设计设计题目: Huffman编码的设计与实现指导教师:龚志伟2011年5月学生姓名:夏文林学号:20083728 分工:程序调试、资料收集学生姓名:易勋学号:20083730分工:源程序、算法分析学生姓名:游斌学号:20083731 分工:文档整理、源程序学生姓名:余璐学号:20083732 分工:源程序、总结学生姓名:朱健学号:20083736 分工:源程序、流程分析与编写中文摘要哈夫曼编码是广泛用于数据文件压缩的十分有效的编码方法。
其压缩通常在20%~90%之间。
哈夫曼编码算法使用字符在文件中出现的频率表来建立一个用0,1串表示各字符的最优表示方式。
哈夫曼算法构造的扩充二叉树称为哈夫曼编码树或哈夫曼树。
当然,还有编码和译码部分。
本系统的前端开发工具是Visual C++6.0。
具有输入字符集大小及权值大小,构造哈夫曼树,并对用户输入的字符串进行编码以及译码还有退出四种功能。
本程序经过测试后,功能均能实现,运行稳定。
关键词:哈夫曼树,编码,权值英文摘要Huffman coding is widely used in data file compression coding method is very effective. The compression usually between 20% ~ 90% in. Huffman use of the character encoding algorithm in the document appeared in frequency table with 0 to build a string of optimal each character said means.The algorithm's construction huffman extended binary tree called huffman coding tree or huffman tree. Of course, there are coding and decoding parts. This system the front-end development tools is Visual c + + 6.0. With input character set size and weitht size, structure tree huffman, and user input string coding and decoding and exit four functions. This procedure after testing, functions are realized, steady operation.目录引言 (4)1、问题分析 (5)2、算法设计 (6)3、算法实现 (6)3.1流程图 (6)3.2程序代码 (7)3.3调试结果 (10)3.3.1例题5—7的测试结果 (10)3.3.2习题5-12的调试结果 (11)4、结论 (13)5、参考文献 (13)引言哈夫曼在上世纪五十年代初就提出这种编码时,根据字符出现的概率来构造平均长度最短的编码。
信息论实验报告(实验四、哈夫曼编码)
3、把这个合成概率看成是一个新组合符号地概率,重复上述做法直到最后只剩下两个符号概率为止;
4、完成以上概率顺序排列后,再反过来逐步向前进行编码,每一次有二个分支各赋予一个二进制码,可以对概率大的赋为零,概率小的赋为1;
5、从最后一级开始,向前返回得到各个信源符号所对应的码元序列,即相应的码字。
“1”,小的概率赋“0”。
(3)从最后一级开始,向前返回得到各个信源符号所对应的码元序列,即相应的码字。
(4)计算码字的平均码长得出最后的编码效率。
五、实验数据记录
六、实验结论与心得
通过本次实验,加强了对matlab程序的学习,进一步提高了我的编程能力。
如有侵权请联系告知删除,感谢你们的配合!
学生实验报告
院别
电子工程学院
课程名称
信息论与编码
班级
实验名称
实验四、哈夫曼编码
姓名
实验时间
学号
指导教师
成绩
报 告 内 容
一、实验目的和任务
1、理解信源编码的意义;
2、熟悉MATLAB程序设计;
3、掌握哈夫曼编码的方法及计算机实现;
4、对给定信源进行香农编码,并计算编码效率;
二、实验原理介绍
1、把信源符号按概率大小顺序排列,并设法按逆次序分配码字的长度;
三、实验设备介绍
1、计算机
2、编程软件MATLAB6.5以上
四、实验内容和步骤
对如下信源进行哈夫曼编码,并计算编码效率。
(1)计算该信源的信源熵,并对信源概率进行排序
(2)首先将出现概率最小的两个符号的概率相加合成一个概率,把这个合成概率与其他的概率进行组合,得到一个新的概率组合,重复上述做法,直到只剩下两个概率为止。之后再反过来逐步向前进行编码,每一次有两个分支各赋予一个二进制码。对大的概率赋
信息论与编码课程设计
信息论与编码课程小结报告----09网工xxx 200940450611.哈夫曼编码简介哈夫曼编码(Huffman Coding)是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。
uffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫作Huffman编码。
2.哈夫曼编码原理哈夫曼编码(Huffman Coding)是一种编码方式,以哈夫曼树—即最优二叉树,带权路径长度最小的二叉树,经常应用于数据压缩。
在计算机信息处理中,“哈夫曼编码”是一种一致性编码法(又称"熵编码法"),用于数据的无损耗压缩。
这一术语是指使用一张特殊的编码表将源字符(例如某文件中的一个符号)进行编码。
这张编码表的特殊之处在于,它是根据每一个源字符出现的估算概率而建立起来的(出现概率高的字符使用较短的编码,反之出现概率低的则使用较长的编码,这便使编码之后的字符串的平均期望长度降低,从而达到无损压缩数据的目的)。
这种方法是由David.A.Huffman发展起来的。
例如,在英文中,e的出现概率很高,而z的出现概率则最低。
当利用哈夫曼编码对一篇英文进行压缩时,e极有可能用一个位(bit)来表示,而z则可能花去25个位(不是26)。
用普通的表示方法时,每个英文字母均占用一个字节(byte),即8个位。
二者相比,e使用了一般编码的1/8的长度,z则使用了3倍多。
倘若我们能实现对于英文中各个字母出现概率的较准确的估算,就可以大幅度提高无损压缩的比例。
3哈夫曼编码步骤首先,哈夫曼编码是哈夫曼树的一个应用,哈夫曼书又称优二树,是一种带路径长度最短的二叉树,所谓树的带权路径长度,就是树中所有的叶节点的权值乘上其到根节点的路径长度(若根节点为0,叶节点到根节点的路径长度为叶节点的层数)。
树的带全路径长度记为WPL=(W1*L1+W2*L2+W3*L3+...+Wn*Ln),N 个权值Wi(i=1,2,...n)构成一棵有N哥叶节点的二叉树,相应的叶节点的路径长度为Li(i=1,2,...n)。
信息论与编码-课程设计报告
目录一:实验原理----------------------------1二:程序源代码--------------------------1三:实验分析-----------------------------6四:实验结论---------------------------7赫夫曼编码一:实验原理哈夫曼编码的具体步骤归纳如下:① 概率统计(如对一幅图像,或m幅同种类型图像作灰度信号统计),得到n个不同概率的信息符号。
② 将n个信源信息符号的n个概率,按概率大小排序。
③ 将n个概率中,最后两个小概率相加,这时概率个数减为n-1个。
④ 将n-1个概率,按大小重新排序。
⑤ 重复③,将新排序后的最后两个小概率再相加,相加和与其余概率再排序。
⑥ 如此反复重复n-2次,得到只剩两个概率序列。
⑦ 以二进制码元(0.1)赋值,构成哈夫曼码字。
编码结束。
哈夫曼码字长度和信息符号出现概率大小次序正好相反,即大概信息符号分配码字长度短,小概率信息符号分配码字长度长。
C、哈夫曼编码的特点(1)哈夫曼编码的构造顺序明确,但码不是唯一的(因以大赋1还是小的赋1而异;(2)哈夫曼编码的字长参差不齐,硬件实现不方便;(3)只有在概率分布很不均匀时,哈夫曼编码才有显著的效果,而在信源分布均匀时,一般不使用哈夫曼编码。
二:程序源代码:#define MAXVALUE 10000#define MAXLEAF 30#define MAXNODE 59#define MAXBIT 10#define LENTH 30#include "stdio.h"#include<iostream>typedef struct{float gailv;int flag;int parent;int lchild;int rchild;char ch;int t;}HNodeType;typedef struct{int bit[MAXBIT];int start;}HCodeType;typedef struct{float gailv;char letter;}mytype; /*it's the type of data save in file*/typedef struct filehuff{int count;mytype mydata[MAXLEAF];filehuff(){count=0; };};filehuff filedata;char code[MAXVALUE];HNodeType HuffNode[MAXNODE];void savetofile(){FILE *fp;if((fp=fopen("datafile.txt","wb"))==NULL){printf("打开失败 ....");return;}if(fwrite(&filedata,sizeof(filedata),1,fp)!=1) printf("写入文件失败 ....");fclose(fp);}void openfile(){ FILE *fp;if((fp=fopen("datafile.txt","rb"))==NULL){return;}fread(&filedata,sizeof(filedata),1,fp);}void translate(){char c;int i,j,k=0,m,n=0;printf("请输入你想要译码的二进制序列 ");printf("\n");getchar();scanf("%c",&c);for(i=0;(i<MAXVALUE)&&(c=='1'||c=='0');i++){ code[i]=c;scanf("%c",&c);}printf("对应的信源符号为:");for(j=0;j<=MAXVALUE&&HuffNode[j].parent!=-1;j++) m=j+1;for(j=0,k=m;j<=i;j++){if(code[j]=='0'){n=HuffNode[k].lchild;if(n==-1){printf("%c",HuffNode[k].ch);k=m;j--;continue;}k=n;}else{n=HuffNode[k].rchild;if(n==-1){printf("%c",HuffNode[k].ch);k=m;j--;continue;}k=n;}}}void Huffman(){HCodeType HuffCode[MAXLEAF],cd;int i,j,m1,m2,x1,x2,c,p,m;if(filedata.count==0){ printf("\n输入信源符号总数 : ");scanf("%d",&m);filedata.count=m;for(i=0;i<2*m-1;i++){ HuffNode[i].gailv=0;HuffNode[i].parent=-1;HuffNode[i].flag=0;HuffNode[i].lchild=-1;HuffNode[i].rchild=-1;HuffNode[i].ch='a';}for(i=0;i<m;i++){ printf("请输入 (概率,信源符号):");scanf("%f %c",&HuffNode[i].gailv,&HuffNode[i].ch); filedata.mydata[i].gailv=HuffNode[i].gailv; filedata.mydata[i].letter=HuffNode[i].ch;savetofile();}}else{ m=filedata.count;for(i=0;i<2*m-1;i++){ HuffNode[i].gailv=0;HuffNode[i].parent=-1;HuffNode[i].flag=0;HuffNode[i].lchild=-1;HuffNode[i].rchild=-1;HuffNode[i].ch=3;}for(i=0;i<m;i++){ HuffNode[i].gailv=filedata.mydata[i].gailv;HuffNode[i].ch=filedata.mydata[i].letter;}}for(i=0;i<m-1;i++){ m1=m2=MAXVALUE;x1=x2=0;for(j=0;j<m+i;j++){ if(HuffNode[j].gailv<m1&&HuffNode[j].flag==0){ m2=m1;x2=x1;m1=HuffNode[j].gailv;x1=j;}else if(HuffNode[j].gailv<m2&&HuffNode[j].flag==0){ m2=HuffNode[j].gailv;x2=j;}}HuffNode[x1].parent=m+i;HuffNode[x2].parent=m+i;HuffNode[x1].flag=1;HuffNode[x2].flag=1;HuffNode[m+i].gailv=HuffNode[x1].gailv+HuffNode[x2].gailv;HuffNode[m+i].lchild=x1;HuffNode[m+i].rchild=x2;}for(i=0;i<m;i++){ cd.start=m-1;c=i;p=HuffNode[c].parent;while(p!=-1){ if(HuffNode[p].lchild==c)cd.bit[cd.start]=0;else cd.bit[cd.start]=1;cd.start--;c=p;p=HuffNode[c].parent;}for(j=cd.start+1;j<m;j++)HuffCode[i].bit[j]=cd.bit[j]; HuffCode[i].start=cd.start;}printf("对应的赫夫曼编码如下:");printf("\n信源符号概率编码\n");for(i=0;i<m;i++){printf("%c %f ",HuffNode[i].ch,HuffNode[i].gailv); for(j=HuffCode[i].start+1;j<m;j++)printf("%d",HuffCode[i].bit[j]);printf("\n");}printf("按任意键继续......\n");}main(){char yn;printf("\n");printf("\n");printf(" 信息论与编码实验 \n");openfile();Huffman();for(;;){printf("\n是否想要把序列译码为信源符号 ?: (输入 y or n) "); scanf("%c",&yn);if(yn=='y'||yn=='Y')translate();elsebreak;}return 0;system("pause");}三:实验分析编码实例如下:由图中可以看出,符合基本的赫夫曼编码的原理,概率大的用短码,概率小的用长码。
《信息论与编码》第5章哈夫曼编码
哈夫曼编码
例:
假设用于通信的电文仅由4个字母{ a,d,i,n } 构成,它们 在电文中出现的概率分别为{ 2,7,5,4},试构建相应的哈 夫曼树,并为这4个字母进行哈夫曼编码
构建哈夫曼树 进行哈夫曼编码
按左分支为0、右分支为1的规则对哈夫曼树的左右分支 进行标记 将从根结点到叶子结点的路径上所有分支标记组成一个 代码序列
字母a的编码为110 字母n的编码为111
1
4 n
因此,在电文中出现频率 高的字母的编码相对短, 而出现频率低的字母的编 码相对长
111 字符编码表HC=((d,0),(i,10),(a,110),(n,111))
哈夫曼编码过程演示
编码 A1 A2 A3 0.23 0.21 0.18
1
0 1 0 1 0.10 0
进行哈夫曼编码 形成代码报文CC 输出
字符频度表W
哈 夫 曼 编 码 系 统 功 能 流 程
形成字符频度表
W
构建哈夫曼树
HT W
进行哈夫曼编码
HC
OC
形成代码报文
CC
原码报文中出现的不同符号个数和频率
代码报文CC
输出CC和W 返回开头
到哈夫曼译码系统
哈夫曼译码系统
来自哈夫曼编码系统 输入W、 CC
这个序列就是该叶子结点对应的字符的编码
哈夫曼编码
4个字母{ a,d,i,n } 在电文中出现的概率分别为{ 2,7,5,4}
字母d的编码为0
18 0
可见:
1
11 0 5
字母i的编码为10
7 d 0 i 10
信息论编码课程设计(用哈夫曼编码实现一个完整的压缩与解压程序)
课程设计任务书2011—2012学年第二学期专业:信息与计算科学学号:姓名:课程设计名称:信息论与编码课程设计设计题目:用哈夫曼编码实现一个完整的压缩与解压程序完成期限:自年月日至年月日共天一.设计目的1、深刻理解信源编码的基本思想与目的;2、理解哈夫曼编码方法的基本过程与特点;3、详细地理解文件的压缩与解压过程;4、提高综合运用所学理论知识独立分析和解决问题的能力;5、使用C语言进行编程。
二.设计内容假设已知一个文件内部所有的字符,编写适当函数,对其进行哈夫曼编码的编译,同时将其运用位操作进行压缩与解压,并且由其文件内字符长度的压缩和气原本长度进行计算,从而得出压缩率的大小。
三.设计要求1、编写的函数要有通用性;2、压缩的文件可以为任意文件,自由选择,并且解压其压缩后的文件显示其是否与原文件内容一致。
四.设计条件计算机、VC6.0编译环境五.参考资料李亦农、李梅《信息论基础教程》指导教师(签字):教研室主任(签字):批准日期:年月日哈夫曼编码(Huffman Coding)是一种编码方式,也是可变字长编码(VLC)的一种。
这种方法完全依据字符出现的概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫作哈夫曼编码。
对于M进制哈弗曼编码,为了提高编码效率,就要使长码的符号数量尽量少、概率尽量小,所以应使合并的信源符号位于缩减信源序列尽可能高的位置上,以减少再次合并的次数,充分利用短码。
本文将采用利用二进制哈夫曼编码来进行文件的压缩与解压。
在二进制哈夫曼编码中,得出码字、平均码长和编码效率,构造哈夫曼树,沿着根节点到叶节点从左到右依次为0、1,并且码字的频率由大到小排序。
在本文中采用Visual C++6.0进行编程,此程序中具有输入字符集大小和权值大小,构造哈夫曼树,并对原本的文件进行编码等功能。
关键词:哈弗曼编码;信源;哈夫曼树;Visual C++6.0;1课题描述 (1)2设计原理 (1)3 设计过程 (2)3.1软件介绍 (2)3.1.1 Visual C++ 6.0简介 (2)3.1.2主要部分 (2)3.2设计内容 (2)4编码程序分析及其结果 (3)总结 (7)参考文献 (7)1课题描述在这个信息量爆炸的时代,凡是能载荷一定信息量,且码字的平均长度最短,可分离的变长码的码字集合称为最佳变长码。
huffman哈夫曼树编码译码课程设计报告
数据结构课程设计信息科学与工程学院:学院计算机科学与技术专业:1601 计卓级:班号:学:学生姓名指导教师:23/ 1年月日题目名称一、实验内容哈夫曼编码译码系统【问题描述】用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。
但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。
对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。
试为这样的信息收发站写一个哈夫曼码的编/译码系统。
【基本要求】1)初始化。
从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树。
2)编码。
利用已建好的哈夫曼树对输入英文进行编码,编码结果存储在数组中。
3)译码。
利用已建好的哈夫曼树将数组中的代码进行译码,结果存入一个字符数组。
4)输出编码。
将编码结果显示在终端上,每行50个代码。
5)输出哈夫曼树。
将哈夫曼树以直观的方式(树或凹入表形式)显示出来。
【实现提示】用户界面可以设计为“菜单”方式,再加上一个“退出”功能。
请用户键入一个选择功能符。
此功能执行完毕后再显示此菜单,直至某次用户选择了“退出”为止。
参考教材P240-246【选做内容】将哈夫曼树保存到文件中,编码和译码的结果也分别存放在两个文本文件中。
23/ 2二、数据结构设计储存结构struct HNodeType {//字符结构体类型int weight;//权int parent;//双亲位置int lchild;//左孩子int rchild;//右孩子char inf;// 字符};struct HcodeType {存储编码int bit[MaxBit];// int start;// 起始位置};三、算法设计1、在构造哈夫曼树时,设计一个结构体数组HuffNode保存哈夫曼树中各结点的信息,根据二叉树的性质可知,具有n个叶子结点的哈夫曼树共有2n-1个结点,所以数组HuffNode的大小设置为2n-1。
哈夫曼编码的分析与实现课程设计
哈夫曼编码的分析与实现课程设计吉林建筑⼤学电⽓与电⼦信息⼯程学院信息理论与编码课程设计报告设计题⽬:哈夫曼编码的分析与实现专业班级:电⼦信息⼯程111学⽣姓名:夏纯学号:10211134指导教师:吕卅王超设计时间:2014.11.24-2014.12.5摘要哈夫曼编码(Huffman Coding)是⼀种编码⽅式,以哈夫曼树—即最优⼆叉树,带权路径长度最⼩的⼆叉树,经常应⽤于数据压缩。
在计算机信息处理中,“哈夫曼编码”是⼀种⼀致性编码法(⼜称"熵编码法"),⽤于数据的⽆损耗压缩。
这⼀术语是指使⽤⼀张特殊的编码表将源字符(例如某⽂件中的⼀个符号)进⾏编码。
这张编码表的特殊之处在于,它是根据每⼀个源字符出现的估算概率⽽建⽴起来的(出现概率⾼的字符使⽤较短的编码,反之出现概率低的则使⽤较长的编码,这便使编码之后的字符串的平均期望长度降低,从⽽达到⽆损压缩数据的⽬的)。
本课题通过C语⾔编写适当的函数,对⼀个随机信源进⾏哈夫曼编码,得出码字,平均码长和编码效率。
从⽽理解信源编码的基本思想与⽬的以及哈夫曼编码⽅法的基本过程与特点,并且提⾼综合运⽤所学理论知识独⽴分析和解决问题的能⼒。
关键字:哈夫曼,信源编码,C语⾔⽬录第1章概述 (1)1.1设计的作⽤、⽬的 (1)1.2设计任务及要求 (1)1.3设计内容 (1)第2章哈夫曼编码的分析与实现 (2)2.1哈夫曼编码介绍 (2)2.2设计原理 (3)2.3哈夫曼编码步骤 (3)2.4哈夫曼编码特点 (4)2.5设计步骤 (4)2.5.1 以框图形式画出哈夫曼编码过程 (4)2.5.2 哈弗曼树的介绍 (5)2.5.3 计算平均码长、编码效率、冗余度 (5)第3章哈夫曼编码C语⾔实现 (7)3.1 C语⾔编程 (7)3.1.1编程环境介绍 (7)3.1.2程序介绍 (7)3.1.3程序测试 (8)3.2 运⾏结果及分析 (10)3.3 程序流程图以及说明 (11)第4章总结 (12)参考⽂献 (14)附录⼀哈夫曼编码分析与实现C语⾔源程序 (15)第1章概述1.1设计的作⽤、⽬的从信息论⾓度看,信源编码的⼀个最主要的⽬的,就是要解决数据的压缩问题。
哈夫曼编码课程设计报告
湖南科技学院数据结构课程设计报告课题: 霍夫曼编码专业班级:信计1202学号:*************名:*******: ***1 课程设计的目的和意义在当今信息爆炸时代,如何采用有效的数据压缩技术来节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视。
哈夫曼编码正是一种应用广泛且非常有效的数据压缩技术。
哈夫曼编码的应用很广泛,利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。
树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1”的序列作为和各个对应的字符的编码,这就是哈夫曼编码。
通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。
电报通信是传递文字的二进制码形式的字符串。
但在信息传递时,总希望总长度尽可能最短,即采用最短码。
2.需求分析课题:哈夫曼编码译码器系统问题描述:打开一篇英文文章,统计该文章中每个字符出现的次数,然后以它们作为权值,对每一个字符进行编码,编码完成后再对其编码进行译码。
问题补充:1. 从硬盘的一个文件里读出一段英语文章;2. 统计这篇文章中的每个字符出现的次数;3. 以字符出现字数作为权值,构建哈夫曼树4. 对每个字符进行编码并将所编码写入文件然后对所编码进行破译。
具体介绍:在本课题中,我们在硬盘D盘中预先建立一个xuzhimo.txt文档,在里面编辑一篇文章(大写)。
然后运行程序,调用fileopen()函数读出该文章,显示在界面;再调用tongji()函数对该文章的字符种类进行统计,并对每个字符的出现次数进行统计,并且在界面上显示;然后以每个字符出现次数作为权值,调用Create_huffmanTree()函数构建哈夫曼树。
然后调用Huffman_bianma()函数对哈夫曼树进行编码,调用coding()函数将编码写入文件。
3 系统(项目)设计(1)设计思路及方案本课题是用最优二叉树即哈夫曼树来实现哈夫曼编码译码器的功能。
信息论与编码课程设计(哈夫曼编码的分析与实现)
吉林建筑大学电气与电子信息工程学院信息理论与编码课程设计报告设计题目:哈夫曼编码的分析与实现专业班级:电子信息工程101学生姓名:学号:指导教师:吕卅王超设计时间:2013.11.18-2013.11.29一、设计的作用、目的《信息论与编码》是一门理论与实践密切结合的课程,课程设计是其实践性教学环节之一,同时也是对课堂所学理论知识的巩固和补充。
其主要目的是加深对理论知识的理解,掌握查阅有关资料的技能,提高实践技能,培养独立分析问题、解决问题及实际应用的能力。
通过完成具体编码算法的程序设计和调试工作,提高编程能力,深刻理解信源编码、信道编译码的基本思想和目的,掌握编码的基本原理与编码过程,增强逻辑思维能力,培养和提高自学能力以及综合运用所学理论知识去分析解决实际问题的能力,逐步熟悉开展科学实践的程序和方法二、设计任务及要求通过课程设计各环节的实践,应使学生达到如下要求:1. 理解无失真信源编码的理论基础,掌握无失真信源编码的基本方法;2. 掌握哈夫曼编码/费诺编码方法的基本步骤及优缺点;3. 深刻理解信道编码的基本思想与目的,理解线性分组码的基本原理与编码过程;4. 能够使用MATLAB 或其他语言进行编程,编写的函数要有通用性。
三、设计内容一个有8个符号的信源X ,各个符号出现的概率为:编码方法:先将信源符号按其出现的概率大小依次排列,并取概率最小的字母分别配以0和1两个码元(先0后1或者先1后0,以后赋值固定),再将这两个概率相加作为一个新字母的概率,与未分配的二进制符号的字母重新排队。
并不断重复这一过程,直到最后两个符号配以0和1为止。
最后从最后一级开始,向前返回得到各个信源符号所对应的码元序列,即为对应的码字。
哈夫曼编码方式得到的码并非唯一的。
在对信源缩减时,两个概率最小的符号合并后的概率与其他信源符号的概率相同时,这两者在缩减中的排序将会导致不同码字,但不同的排序将会影响码字的长度,一般讲合并的概率放在上面,12345678,,,,,()0.40.180.10.10.070.060.050.04X x x x x x x x x P X ⎡⎤⎧⎫=⎨⎬⎢⎥⎣⎦⎩⎭这样可获得较小的码方差。
信息论与编码实验报告
信息论与编码实验报告信息论与编码实验报告一、引言信息论与编码是现代通信领域中的重要理论基础,通过对信息的量化和编码方式的设计,可以提高通信系统的传输效率和可靠性。
本实验旨在通过对信息论与编码的实际应用进行探索,加深对相关理论的理解和掌握。
二、实验目的1. 了解信息论与编码的基本概念和原理;2. 学习使用信息论与编码的工具和方法;3. 进行实际的编码实验,验证理论的有效性。
三、实验内容1. 信息熵的计算信息熵是信息论中的重要概念,用于衡量信息的不确定性。
我们选择一个简单的例子来计算信息熵,假设有一个硬币,正反面出现的概率分别为0.5。
根据信息熵的公式,我们可以计算出该硬币的信息熵为1比特。
2. 信道容量的计算信道容量是指在给定信道带宽和信噪比条件下,信道能够传输的最大数据率。
我们选择一个高斯信道作为实验对象,通过改变信噪比来计算信道容量。
实验结果显示,信噪比越高,信道容量越大。
3. 奇偶校验码的设计与实现奇偶校验码是一种简单的错误检测码,可以用于检测数据传输过程中的错误。
我们设计了一个简单的奇偶校验码方案,并通过编程实现了该方案。
实验结果表明,奇偶校验码能够有效地检测出数据传输中的错误。
4. 哈夫曼编码的设计与实现哈夫曼编码是一种有效的数据压缩算法,通过对出现频率较高的字符进行短编码,可以实现数据的高效传输和存储。
我们选择一段文本作为实验对象,通过统计字符出现频率并设计相应的哈夫曼编码表,成功地对文本进行了压缩。
四、实验结果与分析通过实验,我们成功地计算了信息熵和信道容量,并验证了理论的准确性。
在奇偶校验码的实验中,我们发现该码能够有效地检测出单比特错误,但对于多比特错误的检测能力有限。
在哈夫曼编码的实验中,我们成功地对文本进行了压缩,并获得了较高的压缩比。
五、实验总结通过本次实验,我们深入了解了信息论与编码的基本概念和原理,并通过实际操作加深了对相关理论的理解。
实验结果表明,信息论与编码在通信系统中具有重要的应用价值,能够提高通信效率和可靠性。
哈夫曼编码信息论课程设计
信息论课程设计实验报告专业班级:信计0802姓名:刘建勋学号:07目录:1.课题描述-----------------------------------------------------------------------------------------32.信源编码的相关介绍---------------------------------------------------------------------33.哈夫曼编码-------------------------------------------------------------------------------------3哈夫曼编码算法-----------------------------------------------------------------------3哈弗曼编码的特点--------------------------------------------------------------------4哈夫曼实验原理----------------------------------------------------------------------- 4 4.哈夫曼编码的C++实现-----------------------------------------------------------------5程序设计-----------------------------------------------------------------------------------5运行结果-----------------------------------------------------------------------------------8 总结-----------------------------------------------------------------------------------------------------8 参考文献-------------------------------------------------------------------------------------------------81.课题描述实验类别:设计性实验实验目的:掌握哈夫曼编码原理;了解哈夫曼码的最佳性;实验内容:编程实现二元huffman编码;2.信源编码的相关介绍:信源编码的基础是信息论中的两个编码定理:无失真编码定理和限失真编码定理,前者是可逆编码定理的基础。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
吉林建筑大学电气与电子信息工程学院信息理论与编码课程设计报告设计题目:哈夫曼编码的分析与实现专业班级:电子信息工程101学生姓名:学号:指导教师:吕卅王超设计时间:2013.11.18-2013.11.29一、设计的作用、目的《信息论与编码》是一门理论与实践密切结合的课程,课程设计是其实践性教学环节之一,同时也是对课堂所学理论知识的巩固和补充。
其主要目的是加深对理论知识的理解,掌握查阅有关资料的技能,提高实践技能,培养独立分析问题、解决问题及实际应用的能力。
通过完成具体编码算法的程序设计和调试工作,提高编程能力,深刻理解信源编码、信道编译码的基本思想和目的,掌握编码的基本原理与编码过程,增强逻辑思维能力,培养和提高自学能力以及综合运用所学理论知识去分析解决实际问题的能力,逐步熟悉开展科学实践的程序和方法二、设计任务及要求通过课程设计各环节的实践,应使学生达到如下要求:1. 理解无失真信源编码的理论基础,掌握无失真信源编码的基本方法;2. 掌握哈夫曼编码/费诺编码方法的基本步骤及优缺点;3. 深刻理解信道编码的基本思想与目的,理解线性分组码的基本原理与编码过程;4. 能够使用MATLAB 或其他语言进行编程,编写的函数要有通用性。
三、设计内容一个有8个符号的信源X ,各个符号出现的概率为:编码方法:先将信源符号按其出现的概率大小依次排列,并取概率最小的字母分别配以0和1两个码元(先0后1或者先1后0,以后赋值固定),再将这两个概率相加作为一个新字母的概率,与未分配的二进制符号的字母重新排队。
并不断重复这一过程,直到最后两个符号配以0和1为止。
最后从最后一级开始,向前返回得到各个信源符号所对应的码元序列,即为对应的码字。
哈夫曼编码方式得到的码并非唯一的。
在对信源缩减时,两个概率最小的符号合并后的概率与其他信源符号的概率相同时,这两者在缩减中的排序将会导致不同码字,但不同的排序将会影响码字的长度,一般讲合并的概率放在上面,12345678,,,,,()0.40.180.10.10.070.060.050.04X x x x x x x x x P X ⎡⎤⎧⎫=⎨⎬⎢⎥⎣⎦⎩⎭这样可获得较小的码方差。
四、设计原理4.1哈夫曼编码步骤(1)将信源消息符号按照其出现的概率大小依次排列为≥21≥pnpp≥(2)取两个概率最小的字母分别配以0和1两个码元,并将这两个概率相加作为一个新的概率,与未分配的二进制符号的字母重新排队。
(3)对重新排列后的两个最小符号重复步骤(2)的过程。
(4)不断重复上述过程,知道最后两个符号配以0和1为止。
(5)从最后一级开始,向前返回得到的各个信源符号所对应的码元序列,即为相应的码字。
4.2哈夫曼编码特点哈夫曼编码是用概率匹配的方法进行信源匹配方法进行信源。
它的特点是:(1)哈夫曼的编码方法保证了概率大的符号对应于短码,概率小的符号对应于长码,充分应用了短码。
(2)缩减信源的最后两个码字总是最后一位不同,从而保证了哈夫曼编码是即时码。
(3)哈夫曼编码所形成的码字不是唯一的,但编码效率是唯一的,在对最小的两个速率符号赋值时可以规定大的为“1”,小得为“0”,如果两个符号的出现概率相等时,排列时无论哪个在前都可以,所以哈夫曼所构造的码字不是唯一的,对于同一个信息源,无论上述的顺序如何排列,他的平均码长是不会改变的,所以编码效率是唯一的。
(4)只有当信息源各符号出现的概率很不平均的时候,哈夫曼编码的效果才明显。
(5)哈夫曼编码必须精确的统计出原始文件中每个符号出现频率,如果没有这些精确的统计将达不到预期效果。
哈夫曼编码通常要经过两遍操作,第一遍进行统计,第二遍产生编码,所以编码速度相对慢。
另外实现电路复杂,各种长度的编码的编译过程也是比较复杂的,因此解压缩的过程也比较慢。
(6)哈夫曼编码只能用整数来表示单个符号,而不能用小数,这很大程度上限制了压缩效果。
哈夫曼所有位都是合在一起的,如果改动其中一位就可以使其数据变得面目全非。
五、设计步骤5.1以框图形式画出哈夫曼编码过程(哈夫曼编码要求构建哈夫曼树)。
表1 哈夫曼编码哈夫曼树:给定n个实数w1,w2,......,wn(n≥2),求一个具有n个结点的二叉数,使其带权路径长度最小。
所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。
树的带权路径长度为WPL=(W1*L1+W2*L2+W3*L3+...+Wn*Ln),N个权值Wi(i=1,2,...n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径长度为Li(i=1,2,...n)。
可以证明哈夫曼树的WPL是最小的。
(1)根据与n个权值{w1,w2…wn}对应的n个结点构成具有n棵二叉树的森林F={T1,T2…Tn},其中第i棵二叉树Ti(1 ≤i ≤n)都只有一个权值为wi的根结点,其左、右子树均为空。
(2) 在森林F 中选出两棵根结点的权值最小的树作为一棵新树的左、右子树,且置新树的根结点的权值为其左、右子树上根结点权值之和。
(3)从F 中删除构成新树的那两棵,同时把新树加入F 中。
(4)重复第(2)和第(3)步,直到F 中只含有一棵为止,此树便为Huffman 树。
图1哈夫曼树5.2计算平均码长、编码效率、冗余度。
平均码长为:K =∑=81i )(Ki xi p =0.4×1+0.18×3+0.1×3+0.1×4+0.07×4+0.06×4+0.05×5+0.04×5=2.61(码元/符号)信源熵为:∑===ni xi p xi p X H 1)(log )()(-(0.4log0.4+0.18log0.18+0.1log0.1+0.1log0.1+0.07+log0.07+0.06log0.06+0.05log0.05+0.04log0.04) =2.55bit/符号信息传输速率为:R=KX H )(=61.255.2=0.977bit/码元 编码效率为: η=KX H )(=61.255.2=0.977 冗余度为:γ=1-η=1-0.977=0.023六、哈夫曼编码的实现6.1软件介绍Visual C++ 6.0,简称VC 或者VC6.0,是微软推出的一款C++编译器,将“高级语言”翻译为“机器语言(低级语言)”的程序。
Visual C++是一个功能强大的可视化软件开发工具。
自1993年Microsoft 公司推出Visual C++1.0后,随着其新版本的不断问世,Visual C++已成为专业程序员进行软件开发的首选工具。
Visual C++6.0由Microsoft 开发, 它不仅是一个C++ 编译器,而且是一个基于Windows 操作系统的可视化集成开发环境(integrated development environment ,IDE )。
Visual C++6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard 、类向导Class Wizard 等开发工具。
这些组件通过一个名为Developer Studio 的组件集成为和谐的开发环境。
Microsoft 的主力软件产品。
Visual C++是一个功能强大的可视化软件开发工具。
Visual C++6.0以拥有“语法高亮”,自动编译功能以及高级除错功能而著称。
比如,它允许用户进行远程调试,单步执行等。
还有允许用户在调试期间重新编译被修改的代码,而不必重新启动正在调试的程序。
其编译及创建预编译头文件(stdafx.h)、最小重建功能及累加连结(link)著称。
这些特征明显缩短程序编辑、编译及连结的时间花费,在大型软件计划上尤其显著。
(1)Developer Studio 这是一个集成开发环境,我们日常工作的99%都是在它上面完成的,再加上它的标题赫然写着“Microsoft Visual C++”,所以很多人理所当然的认为,那就是Visual C++了。
其实不然,虽然Developer Studio 提供了一个很好的编辑器和很多Wizard ,但实际上它没有任何编译和链接程序的功能,真正完成这些工作的幕后英雄后面会介绍。
我们也知道,Developer Studio并不是专门用于VC的,它也同样用于VB,VJ,VID等Visual Studio家族的其他同胞兄弟。
所以不要把Developer Studio当成Visual C++,它充其量只是Visual C++的一个壳子而已。
这一点请切记!(2)MFC从理论上来讲,MFC也不是专用于Visual C++,Borland C++,C++Builder 和Symantec C++同样可以处理MFC。
同时,用Visual C++编写代码也并不意味着一定要用MFC,只要愿意,用Visual C++来编写SDK程序,或者使用STL,ATL,一样没有限制。
不过,Visual C++本来就是为MFC打造的,Visual C++中的许多特征和语言扩展也是为MFC而设计的,所以用Visual C++而不用MFC 就等于抛弃了Visual C++中很大的一部分功能。
但是,Visual C++也不等于MFC。
(3)Platform SDK这才是Visual C++和整个Visual Studio的精华和灵魂,虽然我们很少能直接接触到它。
大致说来,Platform SDK是以Microsoft C/C++编译器为核心(不是Visual C++,看清楚了),配合MASM,辅以其他一些工具和文档资料。
上面说到Developer Studio没有编译程序的功能,那么这项工作是由谁来完成的呢?是CL,是NMAKE,和其他许许多多命令行程序,这些我们看不到的程序才是构成Visual Studio的基石。
6.2 编程//**哈夫曼编码**#include <iostream.h>#include <math.h>#include <string.h>#include <stdio.h>#include <stdlib.h>#include <vector>using namespace std;struct Huffman_InformationSource{char InformationSign[10];double Probability;char Code[10];int CodeLength;;};struct HuffNode{char InformationSign[10];double Probability;HuffNode *LeftSubtree,*middleSubtree,*RightSubtree,*Next;char Code[10];int CodeLength;};class CHuffman_2{public:CHuffman_2(){ISNumber=0;AvageCodeLength=0.0;InformationRate=0.0;CodeEfficiency=0.0;Redundancy=0.0;}CHuffman_2(){DestroyBTree(HuffTree);}void Huffman_Input();void Huffman_Sort();void Huffman_Tree();void Huffman_Coding();void Huffman_CodeAnalyzing();void Huffman_Display();void DestroyBTree(HuffNode *TreePointer);private:vector<Huffman_InformationSource>ISarray;int ISNumber;double AvageCodeLength;double InformationRate;double CodeEfficiency;HuffNode * HuffTree;private:void Huffman_Code(HuffNode *TreePointer);};//输入信源信息void CHuffman_2::Huffman_Input(){Huffman_InformationSource temp1={"x1",0.40,"",0};ISarray.push_back(temp1);Huffman_InformationSource temp2={"x2",0.18,"",0};ISarray.push_back(temp2);Huffman_InformationSource temp3={"x3",0.10,"",0};ISarray.push_back(temp3);Huffman_InformationSource temp4={"x4",0.10,"",0};ISarray.push_back(temp4);Huffman_InformationSource temp5={"x5",0.07,"",0};ISarray.push_back(temp5);Huffman_InformationSource temp6={"x6",0.06,"",0};ISarray.push_back(temp6);Huffman_InformationSource temp7={"x7",0.05,"",0};ISarray.push_back(temp7);Huffman_InformationSource temp8={"x8",0.04,"",0};ISarray.push_back(temp8);ISNumber=ISarray.size();}//按概率“从大到小”排序void CHuffman_2::Huffman_Sort(){Huffman_InformationSource temp;int I,j;for(i=0;i<ISNumber-1;i++)for(j=i+1;j<ISNumber;j++)if(ISarray[i].Probability<ISarray[j].Probability){temp=ISarray[i];ISarray[i]=ISarray[j];ISarray[j]=temp;}}void CHuffman_2::Huffman_Tree(){int I;HuffNode *ptr1,*ptr2,*ptr3,*ptr4,*temp1,*temp2;ptr1=new HuffNode;strcpy(ptr1->InformationSign,ISarray[0].InformationSign);ptr1->Probability=ISarray[0].Probability;strcpy(ptr1->Code,ISarray[0].Code);ptr1->LeftSubtree=NULL;ptr1->middleSubtree =NULL;ptr1->RightSubtree=NULL;ptr1->Next=NULL;HuffTree=ptr1;for(i=1;i<ISNumber;i++){ptr2=new HuffNode;strcpy(ptr2->InformationSign,ISarray[i].InformationSign);ptr2->Probability=ISarray[i].Probability;strcpy(ptr2->Code,ISarray[i].Code);ptr2->LeftSubtree=NULL;ptr2->middleSubtree =NULL;ptr2->RightSubtree=NULL;ptr2->Next=ptr1;ptr1=ptr2;}HuffTree=ptr1;int k;int s;k=ceil((double)(ISNumber-3)/(3-1));s=3+k*(3-1)-ISNumber;if(s==1){ptr2=ptr1->Next;ptr4=new HuffNode;strcpy(ptr4->InformationSign,"*");ptr4->Probability=ptr1->Probability+ptr2->Probability;strcpy(ptr4->Code,"");ptr4->LeftSubtree =NULL;ptr4->middleSubtree=ptr1;ptr4->RightSubtree=ptr2;HuffTree=ptr2->Next;temp1=HuffTree;while(temp1&&(ptr4->Probability>temp1->Probability)) {temp2=temp1;temp1=temp1->Next;}ptr4->Next=temp1;if(temp1==HuffTree)HuffTree=ptr4;elsetemp2->Next=ptr4;ptr1=HuffTree;}while(ptr1->Next){//合并概率最小的结点ptr2=ptr1->Next;ptr3=ptr2->Next;ptr4=new HuffNode;strcpy(ptr4->InformationSign,"*");ptr4->Probability=ptr1->Probability+ptr2->Probability +ptr3->Probability;strcpy(ptr4->Code,"");ptr4->LeftSubtree=ptr1;ptr4->middleSubtree=ptr2;ptr4->RightSubtree=ptr3;HuffTree=ptr3->Next;temp1=HuffTree;while(temp1&&(ptr4->Probability>temp1->Probability)){temp2=temp1;temp1=temp1->Next;}ptr4->Next=temp1;if(temp1==HuffTree)HuffTree=ptr4;elsetemp2->Next=ptr4;ptr1=HuffTree;}//释放:ptr1=NULL;ptr2=NULL;ptr3=NULL;ptr4=NULL;temp1=NULL;temp2=NULL;strcpy(HuffTree->Code,"");HuffTree->CodeLength=0;}//生成哈夫曼码void CHuffman_2::Huffman_Code(HuffNode *TreePointer){if (TreePointer == NULL)return;char tempstr[10]="";if(!TreePointer->LeftSubtree&&!TreePointer->middleSubtree&&!TreePointer->RightSubtree){for(int i=0;i<ISNumber;i++)if(strcmp(ISarray[i].InformationSign,TreePointer->InformationSign)==0) {strcpy(ISarray[i].Code,TreePointer->Code);ISarray[i].CodeLength=TreePointer->CodeLength;return;}return;}if(TreePointer->LeftSubtree){strcpy(tempstr,TreePointer->Code);strcat(tempstr,"2");strcpy(TreePointer->LeftSubtree->Code,tempstr);TreePointer->LeftSubtree->CodeLength=TreePointer->CodeLength+1;Huffman_Code(TreePointer->LeftSubtree);}if(TreePointer->middleSubtree){strcpy(tempstr,TreePointer->Code);strcat(tempstr,"1");strcpy(TreePointer->middleSubtree->Code,tempstr);TreePointer->middleSubtree->CodeLength=TreePointer->CodeLength+1;Huffman_Code(TreePointer->middleSubtree);}if(TreePointer->RightSubtree){strcpy(tempstr,TreePointer->Code);strcat(tempstr,"0");strcpy(TreePointer->RightSubtree->Code,tempstr);TreePointer->RightSubtree->CodeLength=TreePointer->CodeLength+1;Huffman_Code(TreePointer->RightSubtree);}}void CHuffman_2::Huffman_Coding(){Huffman_Code(HuffTree);}//编码结果void CHuffman_2::Huffman_CodeAnalyzing(){for(int i=0;i<ISNumber;i++)AvageCodeLength+=ISarray[i].Probability*ISarray[i].CodeLength;int L=1;int m=2; /InformationRate=AvageCodeLength/L*(log(m)/log(2));double Hx=0;for(int j=0;j<ISNumber;j++)Hx+=-ISarray[j].Probability*log(ISarray[j].Probability)/log(2);CodeEfficiency=Hx/InformationRate;Redundancy=1- CodeEfficiency;}void CHuffman_2::Huffman_Display(){cout<<"码字:"<<endl;for(int i=0;i<ISNumber;i++){cout<<"\'"<<ISarray[i].InformationSign<<"\'"<<": "<<ISarray[i].Code<<endl;}cout<<endl;cout<<"平均码长:"<<AvageCodeLength<<endl<<endl;cout<<"编码效率:"<<CodeEfficiency<<endl<<endl;cout<<"冗余度:"<< Redundancy <<endl<<endl;}void CHuffman_2::DestroyBTree(HuffNode *TreePointer) {if (TreePointer!= NULL){DestroyBTree(TreePointer->LeftSubtree);DestroyBTree(TreePointer->middleSubtree);DestroyBTree(TreePointer->RightSubtree);delete TreePointer;TreePointer = NULL;}}void main(){CHuffman_3 YYY;YYY.Huffman_Input();YYY.Huffman_Sort();YYY.Huffman_Tree();YYY.Huffman_Coding();YYY.Huffman_CodeAnalyzing();YYY.Huffman_Display();}6.3 运行结果及分析图2 运行结果运行结果分析:从运行结果上可以看出,该结果与理论计算一致,并且可以看出哈夫曼编码的特点:(1)哈夫曼的编码方法保证了概率大的符号对应于短码,概率小的符号对应于长码,充分应用了短码。