数据结构 第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月月考生物试卷
网友关注
- 房地产公司工程部工作总结
- 函的定义以及写作方法
- 湖北省招标投标综合监督管理条例(征求意见稿)
- 山东百强企业
- 市安监局2006年度工作总结 - 南京市安全生产监督管理局
- 建设工程造价咨询合同示范文本1
- 课堂教学中存在的问题
- 中方回应稀土管理基于环保
- 软件项目开发计划书
- 三年级体育教学工作总结
- 山西南部早期建筑保护工程施工招标投标管理办法
- 二年级新疆教学工作总结
- 小学数学教学工作总结
- 华瀛司253号文件晋中市“一通三防”专项治理运转实施计划
- 教学个人总结
- 中学美术学科教学总结
- 附件:103模範員工推薦表X
- 北师大数学科学学院考研复试分数线复试通知复试名单
- 办公室文书相关材料
- 山地租赁协议书
- 三品三德学习小结
- 砀山经济开发区市政道路工程(1-3标段)
- [最新]文书与档案治理
- 常用商业文书写作
- 中国有限责任公司章程示范文本
- 示范学校建设中期检查计划(参考)
- 对外函件标准格式介绍
- 二0一三年上期语文教学工作总结
- 涵洞工艺标准示范段实施计划书
- 企业自备文件及章程示范文本
网友关注视频
- 青岛版教材五年级下册第四单元(走进军营——方向与位置)用数对确定位置(一等奖)
- 冀教版英语五年级下册第二课课程解读
- 第4章 幂函数、指数函数和对数函数(下)_六 指数方程和对数方程_4.7 简单的指数方程_第一课时(沪教版高一下册)_T1566237
- 外研版英语七年级下册module3 unit1第二课时
- 外研版英语三起6年级下册(14版)Module3 Unit1
- 冀教版小学数学二年级下册第二单元《有余数除法的竖式计算》
- 【部编】人教版语文七年级下册《过松源晨炊漆公店(其五)》优质课教学视频+PPT课件+教案,辽宁省
- 【部编】人教版语文七年级下册《老山界》优质课教学视频+PPT课件+教案,安徽省
- 苏教版二年级下册数学《认识东、南、西、北》
- 二年级下册数学第一课
- 第五单元 民族艺术的瑰宝_16. 形形色色的民族乐器_第一课时(岭南版六年级上册)_T3751175
- 外研版英语三起5年级下册(14版)Module3 Unit1
- 8.对剪花样_第一课时(二等奖)(冀美版二年级上册)_T515402
- 冀教版英语三年级下册第二课
- 沪教版牛津小学英语(深圳用) 四年级下册 Unit 12
- 冀教版小学数学二年级下册第二周第2课时《我们的测量》宝丰街小学庞志荣.mp4
- 河南省名校课堂七年级下册英语第一课(2020年2月10日)
- 【部编】人教版语文七年级下册《泊秦淮》优质课教学视频+PPT课件+教案,湖北省
- 沪教版八年级下册数学练习册21.3(3)分式方程P17
- 化学九年级下册全册同步 人教版 第22集 酸和碱的中和反应(一)
- 小学英语单词
- 《空中课堂》二年级下册 数学第一单元第1课时
- 冀教版小学数学二年级下册第二单元《租船问题》
- 冀教版小学数学二年级下册第二单元《余数和除数的关系》
- 沪教版牛津小学英语(深圳用) 四年级下册 Unit 2
- 沪教版八年级下册数学练习册20.4(2)一次函数的应用2P8
- 3月2日小学二年级数学下册(数一数)
- 人教版二年级下册数学
- 第19课 我喜欢的鸟_第一课时(二等奖)(人美杨永善版二年级下册)_T644386
- 苏科版数学七年级下册7.2《探索平行线的性质》
精品推荐
- 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
- 网吧管理