数据结构 第6章 实验报告 哈弗曼
上传者:何玉|上传时间:2015-05-10|密次下载
数据结构 第6章 实验报告 哈弗曼
数据结构 实验报告
数据结构
实验报告 第六章
实验名称: 文件压缩
实验类型: 综合性实验
班级:
学号:
姓名:
实验日期:2014年6月14日
1.问题描述
哈夫曼编码是一种常用的数据压缩技术,对数据文件进行哈夫曼编码可大大缩短文件的传输长度,提高信道利用率及传输效率。要求采用哈夫曼编码原理,统计文本文件中字符出现的词频,以词频作为权值,对文件进行哈夫曼编码以达到压缩文件的目的,再用哈夫曼编码进行译码解压缩。
? 统计待压缩的文本文件中各字符的词频,以词频为权值建立哈夫曼树,并将该哈夫曼树保存到文件HufTree.dat中。
? 根据哈夫曼树(保存在HufTree.dat中)对每个字符进行哈夫曼编码,并将字符编码保存到HufCode.txt文件中。
? 压缩:根据哈夫曼编码,将源文件进行编码得到压缩文件CodeFile.dat。 ? 解压:将CodeFile.dat文件利用哈夫曼树译码解压,恢复为源文件。
2.数据结构设计
在实验中数据结构设为:
typedef struct
{
char data; //存放字符
unsigned int weight;//权重
unsigned int parent,lchild,rchild;//左孩子标号,右孩子标号 }HTNode,*HuffmanTree; // 动态分配数组存储赫夫曼树
typedef char **HuffmanCode; // 动态分配数组存储赫夫曼编码表
3.算法设计
程序分为以下几个部分:
数据结构 实验报告
(1)统计数据文件里字符以及出现的次数
int *w; //存放每个字符的频数
int i; //用于各种计数
//*********************************************************** //统计1.txt中文件字符以及频数
ifstream fin("d:\\1.txt",ios::in);//从1.txt中读取字符 if(!fin)
{
cout<<"File open error!\n";
return 0;
}
int tongji[256];
int aa; //字符对应的ascii
char cc;//用来读取文件里的字符
for(int ii=0;ii<256;ii++)//初始化
{
tongji[ii]=0;
}
while((cc=fin.get())!=EOF)//从文件读取字符,并建立字符统计数组 {
aa=int(cc);
tongji[aa]++;
}
fin.close();//关闭文件
//**************************************
//用于建立哈弗曼树的统计变量
unsigned int n=0;
for(int ii=0;ii<256;ii++)
{
if(tongji[ii]!=0)
{
n++;
}
}
unsigned int pinshu[n];//每个字符的频数
char zifu[n];//文件中出现的字符
int n1=0;//范围从0--n-1,用于出现过字符的赋值
for(int ii=0;ii<256;ii++)
{
if(tongji[ii]!=0)
{
pinshu[n1]=tongji[ii];
数据结构 实验报告
zifu[n1]=char(ii); ++n1; } }
(2)依据字符出现的频率建立哈弗曼树
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n,char zi[])
{ // w存放n个字符的权值(均>0),zi[]存放n字符,6构造赫夫曼树HT,并求出n个字符的赫夫曼编码HC
int m,i,s1,s2,start;
unsigned c,f;
HuffmanTree p;
char *cd;
if(n<=1) return;
m=2*n-1;
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); // 0号单元未用 for(p=HT+1,i=1;i<=n;++i,++p,++w,++zi) //初始化哈弗曼树
{
(*p).weight=*w;
(*p).data=*zi;
(*p).parent=0;
(*p).lchild=0;
(*p).rchild=0;
}
for(;i<=m;++i,++p) //非叶子节点的父亲为0
(*p).parent=0;
for(i=n+1;i<=m;++i) // 建赫夫曼树
{ // 在HT[1~i-1]中选择parent为0且weight最小的两个结点,其序号分别为s1和s2
select(HT,i-1,s1,s2);
HT[s1].parent=HT[s2].parent=i;
HT[i].lchild=s1;
HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
}
// 从叶子到根逆向求每个字符的赫夫曼编码
HC=(HuffmanCode)malloc((n+1)*sizeof(char*));
// 分配n个字符编码的头指针向量([0]不用)
cd=(char*)malloc(n*sizeof(char)); // 分配求编码的工作空间 cd[n-1]='\0'; // 编码结束符
for(i=1;i<=n;i++)
{ // 逐个字符求赫夫曼编码
start=n-1; // 编码结束符位置
for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)
数据结构 实验报告
// 从叶子到根逆向求编码
if(HT[f].lchild==c)
cd[--start]='0';
else
cd[--start]='1';
HC[i]=(char*)malloc((n-start)*sizeof(char));
// 为第i个字符编码分配空间
strcpy(HC[i],&cd[start]); // 从cd复制编码(串)到HC
}
free(cd); // 释放工作空间
}
int min(HuffmanTree t,int i)
{ // 函数void select()调用
int j,flag;
unsigned int k=UINT_MAX; // 取k为不小于可能的值
for(j=1;j<=i;j++)
if(t[j].weight<k&&t[j].parent==0)
k=t[j].weight,flag=j;
t[flag].parent=1;
return flag;
}
void select(HuffmanTree t,int i,int &s1,int &s2)
{ // s1为最小的两个值中序号小的那个
int j;
s1=min(t,i);
s2=min(t,i);
if(s1>s2)
{
j=s1;
s1=s2;
s2=j;
}
}
(3)存储哈弗曼树,建立字符与哈弗曼编码的对应关系文件
//哈弗曼编码对应表写入
fstream f("d:\\HuffCode.txt",ios::out);//生成哈弗曼编码与字符的对照表 for(i=1;i<=n;i++)//输出字符与哈弗曼编码对照表
{ f<<zifu[i-1]<<"的哈弗曼编码:"<<HC[i]<<endl;}
f.close();
fstream fouthf("d:\\文字翻译到哈弗曼.txt",ios::out);//将翻译后的文字,
数据结构 实验报告
//写入翻译后的文件
ifstream fin1("d:\\1.txt",ios::in);//从1.txt中逐个字符读取
if(!fin1)
{
cout<<"File open error!\n";
return 0;
}
while((cc=fin1.get())!=EOF)//从文件读取字符,
{
for(i=0;i<n;i++)
{
if(cc==zifu[i]) fouthf<<HC[i+1];//把字符对应哈弗曼编码写入 //文件“文字翻译到哈弗曼”
}
}
fin1.close();//关闭文件
fouthf.close();
(4)根据哈弗曼树对数据文件里的数据进行翻译,得到哈弗曼编码
fstream fouthf("d:\\文字翻译到哈弗曼.txt",ios::out);//将翻译后的文字,
写入翻译后的文件
ifstream fin1("d:\\1.txt",ios::in);//从1.txt中逐个字符读取
if(!fin1)
{
cout<<"File open error!\n";
return 0;
}
while((cc=fin1.get())!=EOF)//从文件读取字符,
{
for(i=0;i<n;i++)
{
if(cc==zifu[i]) fouthf<<HC[i+1];//把字符对应哈弗曼编码写入
文件“文字翻译到哈弗曼”
}
}
fin1.close();//关闭文件
fouthf.close();
(5)将哈弗曼编码的8位作为一个字节的8位,以字符形式存进另一文件
//把翻译后的哈弗曼存进数组zongchanghafu[]
char zongchanghafu[sum];
ifstream fin4("文字翻译到哈弗曼.txt",ios::in);//从 文字翻译到哈弗
//曼.txt 中逐个读取哈弗曼编码
if(!fin4)
下载文档
热门试卷
- 2016年四川省内江市中考化学试卷
- 广西钦州市高新区2017届高三11月月考政治试卷
- 浙江省湖州市2016-2017学年高一上学期期中考试政治试卷
- 浙江省湖州市2016-2017学年高二上学期期中考试政治试卷
- 辽宁省铁岭市协作体2017届高三上学期第三次联考政治试卷
- 广西钦州市钦州港区2016-2017学年高二11月月考政治试卷
- 广西钦州市钦州港区2017届高三11月月考政治试卷
- 广西钦州市钦州港区2016-2017学年高一11月月考政治试卷
- 广西钦州市高新区2016-2017学年高二11月月考政治试卷
- 广西钦州市高新区2016-2017学年高一11月月考政治试卷
- 山东省滨州市三校2017届第一学期阶段测试初三英语试题
- 四川省成都七中2017届高三一诊模拟考试文科综合试卷
- 2017届普通高等学校招生全国统一考试模拟试题(附答案)
- 重庆市永川中学高2017级上期12月月考语文试题
- 江西宜春三中2017届高三第一学期第二次月考文科综合试题
- 内蒙古赤峰二中2017届高三上学期第三次月考英语试题
- 2017年六年级(上)数学期末考试卷
- 2017人教版小学英语三年级上期末笔试题
- 江苏省常州西藏民族中学2016-2017学年九年级思想品德第一学期第二次阶段测试试卷
- 重庆市九龙坡区七校2016-2017学年上期八年级素质测查(二)语文学科试题卷
- 江苏省无锡市钱桥中学2016年12月八年级语文阶段性测试卷
- 江苏省无锡市钱桥中学2016-2017学年七年级英语12月阶段检测试卷
- 山东省邹城市第八中学2016-2017学年八年级12月物理第4章试题(无答案)
- 【人教版】河北省2015-2016学年度九年级上期末语文试题卷(附答案)
- 四川省简阳市阳安中学2016年12月高二月考英语试卷
- 四川省成都龙泉中学高三上学期2016年12月月考试题文科综合能力测试
- 安徽省滁州中学2016—2017学年度第一学期12月月考高三英语试卷
- 山东省武城县第二中学2016.12高一年级上学期第二次月考历史试题(必修一第四、五单元)
- 福建省四地六校联考2016-2017学年上学期第三次月考高三化学试卷
- 甘肃省武威第二十三中学2016—2017学年度八年级第一学期12月月考生物试卷
网友关注
- 毛概章节重点内容练习题
- 安全生产百日攻坚专项活动工作情况
- 公司合同外签证管理办法
- 大学三好学生申请材料
- 盘点技术含量较高的四种投资理财方法
- 国考申论必备习近平主席名言警句
- xx学校班主任个人工作考核细则
- 《进化论与心理学及主体性》
- 服装设计:三维服装设计与虚拟试衣
- 免疫学复习材料整理
- 大学生军训简报
- 教育咨询师基本问题答法
- 大一预选逻辑题
- 不忘马克思主义初心,方得共产主义始终——马克思主义指导中国革命实践
- “浅析《围城》中的创作艺术”
- 期刊论文:公路工程施工阶段监理工作的质量控制
- 《无限恐怖》歌曲
- 职工政治学习记录笔记
- 内蒙古方言整理大全
- 保险培训:车辆保险知识讲解
- 孔祥健:违法“校规”亟待规范
- 浅析极简主义风格服装设计
- 论行政过错侵权的法律适用
- 进行家庭教育时的几个注意点
- 真三7游戏武器攻略
- 75道逻辑题整理(含解析)
- 赴美就医攻略
- 培训教案:商贷基础知识
- 2015教师资格证考题(答案版)
- 洪积扇与冲积扇有什么不同
网友关注视频
- 冀教版小学数学二年级下册第二周第2课时《我们的测量》宝丰街小学庞志荣
- 北师大版小学数学四年级下册第15课小数乘小数一
- 化学九年级下册全册同步 人教版 第18集 常见的酸和碱(二)
- 二年级下册数学第一课
- 苏教版二年级下册数学《认识东、南、西、北》
- 沪教版牛津小学英语(深圳用) 四年级下册 Unit 12
- 8 随形想象_第一课时(二等奖)(沪教版二年级上册)_T3786594
- 沪教版八年级下册数学练习册一次函数复习题B组(P11)
- 第五单元 民族艺术的瑰宝_15. 多姿多彩的民族服饰_第二课时(市一等奖)(岭南版六年级上册)_T129830
- 苏科版数学八年级下册9.2《中心对称和中心对称图形》
- 沪教版八年级下册数学练习册20.4(2)一次函数的应用2P8
- 第五单元 民族艺术的瑰宝_16. 形形色色的民族乐器_第一课时(岭南版六年级上册)_T3751175
- 七年级英语下册 上海牛津版 Unit5
- 【部编】人教版语文七年级下册《老山界》优质课教学视频+PPT课件+教案,安徽省
- 沪教版牛津小学英语(深圳用) 五年级下册 Unit 10
- 冀教版英语五年级下册第二课课程解读
- 冀教版小学英语五年级下册lesson2教学视频(2)
- 北师大版数学四年级下册3.4包装
- 【部编】人教版语文七年级下册《逢入京使》优质课教学视频+PPT课件+教案,安徽省
- 【部编】人教版语文七年级下册《逢入京使》优质课教学视频+PPT课件+教案,安徽省
- 二年级下册数学第二课
- 3.2 数学二年级下册第二单元 表内除法(一)整理和复习 李菲菲
- 外研版英语三起6年级下册(14版)Module3 Unit2
- 【部编】人教版语文七年级下册《过松源晨炊漆公店(其五)》优质课教学视频+PPT课件+教案,江苏省
- 沪教版八年级下册数学练习册21.4(1)无理方程P18
- 苏科版八年级数学下册7.2《统计图的选用》
- 【部编】人教版语文七年级下册《逢入京使》优质课教学视频+PPT课件+教案,辽宁省
- 19 爱护鸟类_第一课时(二等奖)(桂美版二年级下册)_T502436
- 外研版英语七年级下册module3 unit2第一课时
- 冀教版英语三年级下册第二课
精品推荐
- 2016-2017学年高一语文人教版必修一+模块学业水平检测试题(含答案)
- 广西钦州市高新区2017届高三11月月考政治试卷
- 浙江省湖州市2016-2017学年高一上学期期中考试政治试卷
- 浙江省湖州市2016-2017学年高二上学期期中考试政治试卷
- 辽宁省铁岭市协作体2017届高三上学期第三次联考政治试卷
- 广西钦州市钦州港区2016-2017学年高二11月月考政治试卷
- 广西钦州市钦州港区2017届高三11月月考政治试卷
- 广西钦州市钦州港区2016-2017学年高一11月月考政治试卷
- 广西钦州市高新区2016-2017学年高二11月月考政治试卷
- 广西钦州市高新区2016-2017学年高一11月月考政治试卷
分类导航
- 互联网
- 电脑基础知识
- 计算机软件及应用
- 计算机硬件及网络
- 计算机应用/办公自动化
- .NET
- 数据结构与算法
- Java
- SEO
- C/C++资料
- linux/Unix相关
- 手机开发
- UML理论/建模
- 并行计算/云计算
- 嵌入式开发
- windows相关
- 软件工程
- 管理信息系统
- 开发文档
- 图形图像
- 网络与通信
- 网络信息安全
- 电子支付
- Labview
- matlab
- 网络资源
- Python
- Delphi/Perl
- 评测
- Flash/Flex
- CSS/Script
- 计算机原理
- PHP资料
- 数据挖掘与模式识别
- Web服务
- 数据库
- Visual Basic
- 电子商务
- 服务器
- 搜索引擎优化
- 存储
- 架构
- 行业软件
- 人工智能
- 计算机辅助设计
- 多媒体
- 软件测试
- 计算机硬件与维护
- 网站策划/UE
- 网页设计/UI
- 网吧管理