Huffman编解码实验报告
更新时间:2023-12-29 18:38:02 阅读量: 教育文库 文档下载
- 黄桃罐头为啥火了推荐度:
- 相关推荐
文本文件的二进制预统计Huffman编解码
一、实验目的
(1) 熟悉Huffman编解码算法; (2) 理解Huffman编码的最佳性。 二、实验内容
1、编程思想
霍夫曼(Huffman)编码是1952年为文本文件而建立,是一种统计编码。属于无损压缩编码。霍夫曼编码的码长是变化的,对于出现频率高的信息,编码的长度较短;而对于出现频率低的信息,编码长度较长。这样,处理全部信息的总码长一定小于实际信息的符号长度。
计算机编程实现时,首先统计带编码的文本文件中各个字符出现的概率,然后将概率作为节点的权值构建huffman树。编码时从叶子节点出发,如果这个节点在左子树上,则编码0,否则编码1,直到根节点为止,所得到的01序列即为该叶子节点的编码。所有叶子节点的编码构成一个码本。
有两种译码方法:(1)按位读入码字,从已建好的Huffman树的根节点开始,若码字为“0”,则跳到左子树,若为“1”则跳到右子树,直到叶子结点为止,输出叶子接点所表示的符号。(2)由于Huffman编码是唯一码,还有另一种译码方法,每读入一位编码就去码本中去匹配相应的码字,若匹配不成功,则继续读入下一个编码,直到匹配成功为止。显然前一种方法比较简便,本程序采用便是该方法。
2、程序流程图
开始编码 开始译码 读入文本文件 读入码本 统计各符号概率 定位到根节点 构建Huffman树 N 读入1位码字 保存码本 码字为1? Y编码 跳到左子树 跳到右子树 输出编码文件 叶子结点? ? Y输出字符 NN 编码结束 码字读完? Y译码结束
3、编程实现
本实验采用用C语言程序语言,VC++ 6.0编程环境。 (1)数据结构
构造存放符号及其权值的存储结构如下 typedef struct {
unsigned char symbol; //符号的ASCII码值 int sweight; //权值
}syml_weit;
syml_weit *sw;
sw
symbol sweight
构造huffman树存储结构如下:
typedef struct {
int weit; //权值
int lchd; //左孩子地址 int rchd; //右孩子地址 int part; //双亲地址 }hufmtree;
hufmtree *htree;
htree
weit lchd rchd part;
(2)函数
本程序共包含5个函数: 一个主函数:
void main(), 4个子函数:
void CountWeight(unsigned char *DataBuf,int FileLen); void BuildTree();
void HufmCode(unsigned char *DataBuf,int FileLen); void HufmDCode(unsigned char *CDataBuf,int CDataLen); 其功能分别是:
CountWeight----计算文本文件中各符号的权值; BuildTree-------构建Huffman树,形成码本; HufmCode---------对文本文件进行编码; HufmDCode-------进行译码。 (3)存储器
本程序共包含4个存储器:
unsigned char *DataBuf; //存放文本文件数据的内存空间 unsigned char *CodeBook; //存放码本
unsigned char *CodeBuf; //存放编好的码
unsigned char *DCodeBuf; //存放译码后数据
详细代码见附件。
三、实验结果
程序运行后会形成3个文件:
codebook.txt-------码本文件; abc_code.txt-------编码文件; abc_dcode.txt------译码文件。
经比较译码后的文件与待编码文件相同,编译码成功实现
为了编写简单,编码文件输出时未采用的比特输出的方式,而采用了字节输出方式,即每个字节代表一个码字。这样输出文件大小是理论值的8倍。因此计算压缩率时应该除以8才是真正的压缩率。
已编码文件大小/8 压缩率 = 待编码文件大小 *100% = 42231/8/9433*100% = 55.96178%
附件:完整程序代码
#include
typedef struct {
unsigned char symbol; int sweight; }syml_weit;
syml_weit *sw; //存放符号及其权值
typedef struct {
int weit; int lchd; int rchd; int part; }hufmtree;
hufmtree *htree; //存放Huffman树
int leafnode,totalnode; //叶子节点个数 和 整棵树的所有节点 unsigned char *DataBuf; //存放文本文件数据的内存空间 unsigned char *CodeBook; //存放码本 unsigned char *CodeBuf; //存放编好的码 unsigned char *DCodeBuf;
int CodeBookLen; //码本长度 int CodeLen; //码长度 int DCodeLen;
void CountWeight(unsigned char *DataBuf,int FileLen); void BuildTree();
void HufmCode(unsigned char *DataBuf,int FileLen); void HufmDCode(unsigned char *CDataBuf,int CDataLen);
void main() {
FILE *fp1,*fp2,*fp3,*fp4; //文件读取指针 char filepath[]=\
int FileLen; //读入的文件长度 DataBuf = new unsigned char[1024*1024];
{ }
FILE *lp; int i=0;
DCodeBuf = new unsigned char[1024*1024]; while (i int p=totalnode-1; while (p>=leafnode) { if (*(CDataBuf+i)==1) p=htree[p].rchd; else p=htree[p].lchd; i++; } *(DCodeBuf+DCodeLen) = sw[p].symbol; DCodeLen++; }
正在阅读:
Huffman编解码实验报告12-29
美术联考速写引发的教学思考-教育文档12-23
优秀团员申报表及事迹材料06-30
wk4-01(作业长)05-14
某大型综合性医院医生综合素质和工作绩效评价指标体系的设计08-08
中国无线增值服务产业竞争调研及未来五年发展战略研究报告05-22
忏悔录奥古斯丁02-18
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 解码
- Huffman
- 实验
- 报告
- 大学生职业生涯规划书范文
- 综合布线系统需求分析报告
- 车库破桩头及垫层施工方案
- 2019年中国市政工程建设及ppp模式行业深度调研与投资战略研究报告(定制版)目录
- 09235设计原理-历年真题
- win7+ubuntu 13.04双系统安装方法 - 图文
- 2016年个人述职述廉报告 范文
- 教科版科学五年级下册《寻找时间的痕迹》教学设计(精品).doc
- 市长在全市发展和改革工作会议上的讲话(2012)
- 八年级生物下册7.2.5生物的变异学案设计(新版)新人教版
- 推荐下载 县党员轮训工作总结-最新
- 小学生逻辑推理问题4-6年级使用
- (机械专业)大学生职业生涯规划书范文三篇
- 2016年专业技术人员在线培训答案《目标与时间管理》(最权威)
- 12英语词汇学试卷
- 关于比特币,你了解多少?
- 2021福州大学电子与通信工程考研真题经验参考书
- 让绿色评价走进语文课堂教学-教育文档
- 旅游地产购买行为影响因素研究
- 小学六年级体育教案((全册))