- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
哈夫曼编码实现文本文件的压缩和解压缩
任务分析和定义
在了解哈夫曼编码压缩解压缩原理之前,首先让我们来认识哈夫曼树和哈夫曼编码。
在了解哈夫曼编码压缩解压缩原理之前,首先让我们来认识哈夫曼树。哈夫曼树又称最优二叉树,是带权路径长度最小的二叉树。
在文本文件中多采用二进制编码。为了使文件尽可能的缩短, 可以对文件中每个字符出现的次数进行统计。设法让出现次数多的字符二进制码短些, 而让那些很少出现的字符二进制码长一些。若对字符集进行不等长编码,则要求字符集中任一字符的编码都不是其它字符编码的前缀。为了确保哈夫曼编码的唯一性,我们可以对它的左右子树的大小给予比较限定,如:左子树的权值小于右子树的权值。哈夫曼树中的左右分支各代表‘0’和‘1’,则从根节点到叶子节点所经历的路径分支上的‘0’或‘1’组成的字符串,为该节点对应字符的哈夫曼编码。
统计字符集中每个字符在文件中出现的平均概率(概率越大,要求编码越短)。利用哈夫曼树的特点:权越大的叶子离根越近,将每个字符的概率值作为权值,构造哈夫曼树。则概率越大的结点,路径越短。哈夫曼译码是从二进制序列的头部开始,顺序匹配成共的部分替换成相应的字符,直至二进制转换为字符序列。
哈夫曼用于文件解压缩的基础是在压缩二进制代码的同时还必须存储相应的编码,这样就可以根据存储的哈夫曼编码对压缩代码进行解压缩。
总之,该课题的任务应该是首先要打开要压缩的文本文件并读出其中字符出现的频率,以其为权值构建哈夫曼树。其次要找到构建压缩功能的方法,在构建哈夫曼树的基础上进行编码,改变字符原先的存储结构,以达到压缩文件的目的,此外还要存储相应的哈夫曼编码,为解压缩做准备。
二、概要设计和数据结构的选择
以下是在任务分析及对题意的理解做出的概要设计和对数据结构的选择。
1.数据结构定义:
struct head
{
unsigned char b; //记录字符在数组中的位置
long count; //字符出现频率(权值)
long parent,lch,rch; //定义哈夫曼树指针变量
char bits[256]; //定义存储哈夫曼编码的数组
}
header[512],tmp;
2.定义所需要的子函数:
void compress() //用于实现文件的压缩功能
void uncompress() //用于实现文件的解压缩功能
3.主程序的流程及程序模块间的关系:
主函数实现菜单工具栏,并且能够对用户的输入进行容错处理,通过if语句实现该工具的两个子功能:即:
调用压缩子函数压缩同文件夹下的字符型文本文件
调用解压缩子函数解压缩同文件夹下的字符型文本文件
并可在完成相应功能后安全退出
压缩或解压缩的文件在同文件夹下生成
4. 流程图:
图1. 程序模块
图2. 压缩函数
图3. 解压缩函数
详细设计和编码
以下是主函数和子函数的详细设计和附部分源代码。
压缩(compress)子函数设计
该函数主要是为了实现对同文件夹下文本文件的压缩。
1.1算法中先是统计文件中字符重复出现的频率和文件的长度。字符出现的频率用作结点的权值,而原文件长度用作求压缩率的分母。
1.2 然后对结点进行初始化,根据频率(权值)大小,对结点进行排序,依次选择权值较小且parent域不等于-1的结点建哈夫曼树。计算左右孩子权值大小,与后续进入树的结点权值进行比较,从而确定后续结点在树中的位置。
1.3 进行哈夫曼无重复前缀编码,再对哈夫曼编码进行位操作从原先的按字节存储到现在的按位存储实现字符存储空间的压缩。假设原文件第一个字符是“A”,8位2进制编码后为0110识别编码第一个‘0’,那么我们就可以将其左移一位,看起来没什么变化。下一个是‘1’,应该|1,结 同理4位都做完,应该由于字节中的8位并没有全部用完,我们应该继续读下一个字符,根据编码表继续拼完剩下的4位,如果字符的编码不足4位,还要继续读一个字符,如果字符编码超过4位,那么我们将把剩下的位信息拼接到一个新的字节里。其中编码后压缩字符存储空间从字节到位代码实现如下:
for(i=0;in;i++)
{
fwrite((header[i].b),1,1,ofp);
c=strlen(header[i].bits);
fwrite(c,1,1,ofp);
j=strlen(header[i].bits);
if(j%8!=0) //若存储的位数不是8的倍数,则补0
您可能关注的文档
最近下载
- 液相色谱U-3000使用说明书之五.pdf VIP
- 计算机专业学生生涯发展报告.docx VIP
- “讽刺类小说”群文阅读《范进中举》《孔乙己》《变色龙》九年级语文上学期课件.pptx VIP
- U-3000使用说明书之四.pdf VIP
- 2025年新人教版七年级上册数学课件 4.2.1 合并同类项.pptx
- u-3000使用说明书之一.pdf VIP
- BS_EN_50262_1999_中文版.pdf VIP
- 江苏省南京师范大学附属中学宿迁分校2023-2024学年七年级上学期11月期中英语试题.docx VIP
- 闸门液压启闭系统培训课件.pptx VIP
- 单项式乘单项式学年八年级数学公开课比赛一等奖.pptx
原创力文档


文档评论(0)