- 1、本文档共24页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据结构课程设计报告
基于哈夫曼树的文件压缩 /解压程序
专业班级:信科( 2)班
姓名:徐爱娟 谢静
学号: xxxxx
xxxx
20xx-12_31
一 需求分析
1.课题要求(实现文件的压缩与解压并计算压缩率)
A. 描述压缩基本符号的选择方法
B.运行时压缩原文件的规模应不小于 5K
2.设计目标
软件名称:基于哈夫曼编码的文件压缩实用程序系统
软件组成: huffman.exe
制作平台及相关调试工具:
Windows XP sp3 Microsoft Visual C++ 6.0
D 运行环境: dos/ win2K/win2003/winxp/
性能特点:
软件由一个可执行文件组成
huffman.exe 为 dos 系统应用程序,体积小,高效快捷,适用范围广。
对单字节( 256 叶子)进行哈夫曼编码,压缩率良好
使用二级缓冲压缩 / 解压技术,速度比一般算法高
4. 可压缩最大体积为 4G 的文件,达到 Fat32 文件系统极限
文件索引体积比常规算法小50%
概要设计
1.相关函数介绍
1. bool InitFromFile(string fileadd) 从文件中初始化哈夫曼树函数
2. void HTCreat(HTNode ht[],int n) 构造哈夫曼树函数
3. void HCCreat(HTNode ht[],HCode hcd[],int n) 构造哈夫曼编码函数
4. void ConvertFile(HCode hcd[],string fileadd,string fileadd2) 压缩 and 写入文件函数
5. void DecompressionFile(string fileadd2,string fileadd3) 文件解压函数
6. string Compression(string fileadd) 压缩函数
7. string Decompression(string fileadd2) 解压函数
三 详细设计
1 压缩算法部分
A 核心算法:
Huffman 编码是一种可变长编码方式,是由美国数学家
David Huffman 创立的,是
二叉树的一种特殊转化形式。编码的原理是:将使用次数多的代码转换成长度较短的代
码,而使用次数少的可以使用较长的编码,并且保持编码的唯一可解性。
Huffman 算法的
最根本的原则是:累计的
( 字符的统计数字 * 字符的编码长度
) 为最小,也就是权值 ( 字符的
统计数字 *字符的编码长度 ) 的和最小。
B 哈夫曼树构造算法:
Huffman 树是二叉树的一种特殊转化形式。以下是构件
Huffman 树的例子:比如有
以下数据, ABFACGCAHGBBAACECDFGFAAEABBB先进行统计 A(8) B(6) C(4) D(1) E(2) F(3)
G(3) H(1)括号里面的是统计次数
Clock ( )
生成 Huffman 树:每次取最小的那两个节点 (node)
合并成一个节点 (node) ,并且将累
计数值相加作为新的接点的累计数值,最顶层的是根节点
(root)
注:列表中最小节点的
是指包括合并了的节点在内的所有节点,已经合并的节点不在列表中
运算的过程如下:
1:D+H(2)
2:DE+H(4)
3:F+G(6)
4:C+DEH(8)
5:B+FG(12)
6:A+CDEH(16)
7:ACDEH+BFG(28)
那么转化为 Huffman 树就是
Huffman 树
层数
Root
┌┴┐
ACDEH BFG
1
┌┴┐┌┴┐
CDEH A B
FG
2
┌┴┐
┌┴┐
DEH C F
G
3
┌┴┐
DH
E
4
┌┴┐
D H
5
取左面是
1 右面是
0 则有。
注:层数就是位数或者说是代码长度,权值
=代码长度 * 该字的统计次数。
代码
位数
权值
A = 10
2
16
B = 01
2
12
C = 110
3
12
D = 11111
5
5
E = 1110
4
8
F = 001
3
9
G = 000
2
6
H = 11110
5
5
可以看出 Huffman 代码是唯一可解的 (uniquely decodable) ,如果你读到 110 就一定是
C ,不会有任何一个编码是以 110 开始的。
如果不使用 Huffman 算法,而使用普通的编码,结果是什么呢?
Huffman 树 层数
Root
┌┴┐
ABCD EFGH 1
┌┴┐ ┌┴┐
AB CD EF GH 2
┌┴┐┌┴┐┌┴┐┌┴┐
A B C D E F G H
3
取左面是
1 右面是 0 则有
代码
位数
权值
A = 111
3
24
B = 11
文档评论(0)