哈夫曼的文件压缩解压程序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
列出测试结果,包括输入的数据和相应的输出数 据。这里的测试数据应该完整和严格,最好多于需求 分析中所列的测试项。 7、 附录(电子版文档必须要,打印版该部分可不打印)
应附上带详细注释的可读性好的源程序。
数据结构课程设计报告-示例文档
13
时间安排
时间
内容
第1周
复习数据结构相关原理,明确题 目要求、确定数据结构与设计方 案
5.典型的几种数据结构:
顺序表,链表, 顺序栈,链栈,循环队列,链队列, 字符串, 多维数组, 二叉链表树,二叉顺序树, 邻接矩阵图,邻接表图, 散列表
4
设计题目
基于哈夫曼树的文件压缩/解压程序
(《数据结构课程设计案例精编》P329) 该参考教材同学们可自行借阅或在网上购买(一般8
折),也可联系出版社市场部集体定购(清华大学出版社 市场部电话:010-62788562(转分机号220)),可能有更 大折扣。
个操作只需要写出伪代码算法,画出函数的调 用关系图。 4、 调试分析报告
调试过程中遇到的问题并且是如何解决的 以及对设计实现的回顾讨论和分析算法的时空 分析(包括基本操作和主要算法的时空复杂度 的分析)和改进设想经验和体会等
12
5、 用户使用说明 向用户说明如何使用你编写的程序,详细列出每
一步的操作步骤。 6、 测试结果
D:111
E:011 F:10
G:01011 H:110 26
电文中共使用八种字符,如果按一般方法对其进 行编码,则最少需要3位码长,如:A(000), B(001),C(010),D(011),E(100),F(101), G(110),H(111),假设电文中共100个字符, 按其出现频率则该电文的码长为:3*100=300。
如何构造最优 树
前缀编码 16
一、最优树的定义
树的带权路径长度定义为:
树中所有叶子结点的带权路径长度之和
WPL(T) = wklk (对所有叶子结点)
例如:
在所有含 n 个叶子结点、并带相同权 值的 m 叉树中,必存在一棵其带权路径 长度取最小值的树,称为“最优树”。
17
75
9
24
WPL(T)= 72+52+23+ 43+92 =60
2009年11月16日前交齐 全部课程资料,逾期者 以缺考处理,课程成绩0 分。
14
考核方式与成绩
程序:30% 课程设计报告:70%
2009年11月16日前以班为单位交齐 全部课程考核资料(光盘和课程设计打 印稿),逾期者以缺考处理,课程成绩0 分。
15
6.8 哈 夫 曼 树 与 哈夫曼编码
最优树的定义
若按哈夫曼编码A:01010(5位)B:00(2位) C:0100(4位)D:111(3位)E:011(3位)F: 10(2位)G:01011(5位)H:110(3位),按 其出现频率则该电文的码长(即带权路径长度 WPL)为: 4*5+30*2+8*4+9*3+13*3+22*2+3*5+11*3 =270,
7
STL总结
尽管很多程序员仍然在使用标准C与C++函数,使用标 准C函数确实方便(如使用sprintf()进行格式化输出)。但 是C与C++函数不使用异常机制来报告错误,也不适合 处理新的数据类型。而且标准C与C++函数经常使用内 存分配技术,没有经验的程序员很容易写出bug来。. STL的最主要的两个特点:数据结构和算法的分离, 非面向对象本质。访问对象是通过象指针一样的迭代 器实现的;容器是象链表,矢量之类的数据结构,并 按模板方式提供;算法是函数模板,用于操作容器中 的数据。由于STL以模板为基础,所以能用于任何数 据类型和结构。
数据结构课程设计
陈正铭
1
教学目的与要求
《数据结构》课程设计的目的就是要达到理论 与实际应用相结合,使同学们能够根据数据对 象的特性,学会数据组织的方法,能把现实世 界中的实际问题在计算机内部表示出来,并培 养基本的、良好的程序设计技能。
通过这次课程设计,要求掌握数据结构的逻 辑特性和物理表示,数据结构的选择应用、算 法的设计及其实现和性能分析等方面中加深对 课程基本内容的理解。同时,在程序设计方法 以及上机操作等基本技能和科学作风方面受到 比较系统和严格的训练。
28
第2~8周 编写程序,准备测试数据
第9周
上机演示,回答教师提问,按格 式撰写课程设计报告
地点
备注
课室
实验室或 在实验室或宿舍完成编 宿舍 写程序任务
实验室
课程设计报告应严格按 照上述设计报告撰写要 求撰写;最后将报告用 A4纸打印装订;
第10周
以班为单位上交课程设计的资料 光盘(内含每个同学的课程设计 的源程序、编译后可直接运行的 目标程序与课程设计报告的电子 文档),课程设计报告打印稿
(2) 在 F 中选取其根结点的权值为最 小的两棵二叉树,分别作为左、 右子树构造一棵新的二叉树,并 置这棵新的二叉树根结点的权值 为其左、右子树根结点的权值之 和;
20
(3) 从F中删去这两棵树,同时加入 刚生成的新树;
(4)重复 (2) 和 (3) 两步,直至 F 中只 含一棵树为止。
21
例如: 已知权值 W={ 5, 6, 2, 9, 7 } 562 97
2
数据结构基本原理简要复习
1.数据元素之间的四种基本逻辑结构: 非线性,线性,树,图
2.数据物理表示(存储方法): 顺序存储,链式存储,索引存储,散列存储
3.算法的特征: 有穷性,可行性,确定性,正确性
算法设计的要求: 可读性,健壮性,高效性
3
4.算法的时间复杂度、空间复杂度及分析: O(1),O(n),O(logn),O(n2)
ቤተ መጻሕፍቲ ባይዱ
697
7
52
97
13
5 2 67
22
97 52
13
67
29
0
1
13 01
67 00 01
16 01
9 10
07 1
52
110 11231
三、前缀编码
指的是,任何一个字符的编码都 不是同一字符集中另一个字符的编码 的前缀。
利用赫夫曼树可以构造一种不等 长的二进制编码,并且构造所得的赫 夫曼编码是一种最优前缀编码,即使 所传电文的总长度最短。
强调的是程序要做什么?明确规定:输入的形 式和输出、值的范围;输出的形式;程序所能 达到的功能;测试的数据:包括正确的输入和 错误的输入及其相应的输出结果; 2、 概要设计
问题解决的思路概述;说明程序中用到的 所有抽象数据类型的定义,主程序的流程以及 各程序模块之间的层次(调用)关系。
11
3、 详细设计 实现概要设计中定义所有数据类型,对每
2 4
5
79
WPL(T)=
74+94+53+
42+21
=89
18
二、如何构造最优树
(赫夫曼算法) 以二叉树为例:
(1) 根据给定的 n 个权值 {w1, w2, …, wn}, 构造 n 棵二叉树的集合
F = {T1, T2, … , Tn}, 其中每棵二叉树中均只含一个带权值
为
wi
的根结点,其左、右子树为空树; 19
选做内容:求出压缩率;打印哈夫曼树;对文件夹压缩;图 形图形化窗口操作界面。 (参考教材的本题目设计指导部分的扫描页)
程序建议使用c++语言完成,建议开发工具为Microsoft Visusl C++ 2005 Express(可在微软网站免费下载)。
10
设计报告撰写指导
1、 需求分析 以无歧义的陈述说明所选设计题目的任务,
该参考教材内容丰富,尤其是C++语言 STL方面的内容,对 日后从事开发设计工作的同学有较大参考作用。但教材价 格较贵,零售价45元,因此本学期没为大家指定定购,大 家可按需购买,但建议购买。
5
STL(Standard Template Library, 标准模板库)概述
STL的一个重要特点是数据结构和算法的分离。尽管 这是个简单的概念,但这种分离确实使得STL变得非 常通用。例如,由于STL的sort()函数是完全通用的, 你可以用它来操作几乎任何数据集合,包括链表,容 器和数组。 STL另一个重要特性是它不是面向对象的。 为了具有足够通用性,STL主要依赖于模板而不是封 装,继承和虚函数(多态性)——OOP的三个要素。 STL提供了大量的模板类和函数,可以在OOP和常规 编程中使用。所有的STL的大约50个算法都是完全通 用的,而且不依赖于任何特定的数据类型。
6
STL组成
三个基本的STL组件: 1)迭代器,提供了访问容器中对象的方法。例如,可以使用一对 迭代器指定list或vector中的一定范围的对象。迭代器就如同一个 指针。事实上,C++的指针也是一种迭代器。但是,迭代器也可 以是那些定义了operator*()以及其他类似于指针的操作符地方法的 类对象。 2)容器,是一种数据结构,如list,vector,和deques ,以模板类 的方法提供。为了访问容器中的数据,可以使用由容器类输出的 迭代器。 3) 算法,是用来操作容器中的数据的模板函数。例如,STL用 sort()来对一个vector中的数据进行排序,用find()来搜索一个list中 的对象。函数本身与他们操作的数据的结构和类型无关,因此他 们可以在从简单数组到高度复杂容器的任何数据结构上使用。
24
练习题
有一份电文中共使用八种字符,频率依 次为: A(0.04),B(0.3),C(0.08),D(0.09), E(0.13),F(0.22),G(0.03),H(0.11),
请构造相应的哈夫曼树(要求树中所有 结点的左右孩子权值必须左大右小),求 出每个字符的哈夫曼编码。
25
解:
设左子树编码为0,右子树编码为1,则 A,B,C,D,E,F,G,H字符的哈夫曼编码为:A: 01010 B:00 C:0100
明显的压缩了30位码长。
27
程序设计思路
文件由若干个字节组成,一个字节有 8bits,故有28=256种字节构成形式,对应 字节码为0-255。按此256种字节出现频率 可构造haffman树进行重新编码,编码后 每 字 节 的 新 编 码 平 均 长 度 将 <=8bits , 将 每个字节对应了压缩编码写到新文件中, 从而达到压缩文件的目的。
8
STL示例——排序算法
(1)自行写排序算法与调用; (2)调用标准C++函数qsort()完成排序; (3)部分使用STL特性; (4)完全使用STL特性。
9
设计要求
基于哈夫曼树的文件压缩/解压程序
基本要求:实现一个基于哈夫曼树的文件压缩程序和文件解 压程序。要求压缩程序读入源文件,分析每种字符的频度, 然后建立相应的哈夫曼树,再求出相应哈夫曼编码,根据 编码对源文件进行压缩,得到源文件对应的压缩文件。解 压程序读入压缩文件,根据相应的哈夫曼编码解压还原 , 得到对应的源文件。
应附上带详细注释的可读性好的源程序。
数据结构课程设计报告-示例文档
13
时间安排
时间
内容
第1周
复习数据结构相关原理,明确题 目要求、确定数据结构与设计方 案
5.典型的几种数据结构:
顺序表,链表, 顺序栈,链栈,循环队列,链队列, 字符串, 多维数组, 二叉链表树,二叉顺序树, 邻接矩阵图,邻接表图, 散列表
4
设计题目
基于哈夫曼树的文件压缩/解压程序
(《数据结构课程设计案例精编》P329) 该参考教材同学们可自行借阅或在网上购买(一般8
折),也可联系出版社市场部集体定购(清华大学出版社 市场部电话:010-62788562(转分机号220)),可能有更 大折扣。
个操作只需要写出伪代码算法,画出函数的调 用关系图。 4、 调试分析报告
调试过程中遇到的问题并且是如何解决的 以及对设计实现的回顾讨论和分析算法的时空 分析(包括基本操作和主要算法的时空复杂度 的分析)和改进设想经验和体会等
12
5、 用户使用说明 向用户说明如何使用你编写的程序,详细列出每
一步的操作步骤。 6、 测试结果
D:111
E:011 F:10
G:01011 H:110 26
电文中共使用八种字符,如果按一般方法对其进 行编码,则最少需要3位码长,如:A(000), B(001),C(010),D(011),E(100),F(101), G(110),H(111),假设电文中共100个字符, 按其出现频率则该电文的码长为:3*100=300。
如何构造最优 树
前缀编码 16
一、最优树的定义
树的带权路径长度定义为:
树中所有叶子结点的带权路径长度之和
WPL(T) = wklk (对所有叶子结点)
例如:
在所有含 n 个叶子结点、并带相同权 值的 m 叉树中,必存在一棵其带权路径 长度取最小值的树,称为“最优树”。
17
75
9
24
WPL(T)= 72+52+23+ 43+92 =60
2009年11月16日前交齐 全部课程资料,逾期者 以缺考处理,课程成绩0 分。
14
考核方式与成绩
程序:30% 课程设计报告:70%
2009年11月16日前以班为单位交齐 全部课程考核资料(光盘和课程设计打 印稿),逾期者以缺考处理,课程成绩0 分。
15
6.8 哈 夫 曼 树 与 哈夫曼编码
最优树的定义
若按哈夫曼编码A:01010(5位)B:00(2位) C:0100(4位)D:111(3位)E:011(3位)F: 10(2位)G:01011(5位)H:110(3位),按 其出现频率则该电文的码长(即带权路径长度 WPL)为: 4*5+30*2+8*4+9*3+13*3+22*2+3*5+11*3 =270,
7
STL总结
尽管很多程序员仍然在使用标准C与C++函数,使用标 准C函数确实方便(如使用sprintf()进行格式化输出)。但 是C与C++函数不使用异常机制来报告错误,也不适合 处理新的数据类型。而且标准C与C++函数经常使用内 存分配技术,没有经验的程序员很容易写出bug来。. STL的最主要的两个特点:数据结构和算法的分离, 非面向对象本质。访问对象是通过象指针一样的迭代 器实现的;容器是象链表,矢量之类的数据结构,并 按模板方式提供;算法是函数模板,用于操作容器中 的数据。由于STL以模板为基础,所以能用于任何数 据类型和结构。
数据结构课程设计
陈正铭
1
教学目的与要求
《数据结构》课程设计的目的就是要达到理论 与实际应用相结合,使同学们能够根据数据对 象的特性,学会数据组织的方法,能把现实世 界中的实际问题在计算机内部表示出来,并培 养基本的、良好的程序设计技能。
通过这次课程设计,要求掌握数据结构的逻 辑特性和物理表示,数据结构的选择应用、算 法的设计及其实现和性能分析等方面中加深对 课程基本内容的理解。同时,在程序设计方法 以及上机操作等基本技能和科学作风方面受到 比较系统和严格的训练。
28
第2~8周 编写程序,准备测试数据
第9周
上机演示,回答教师提问,按格 式撰写课程设计报告
地点
备注
课室
实验室或 在实验室或宿舍完成编 宿舍 写程序任务
实验室
课程设计报告应严格按 照上述设计报告撰写要 求撰写;最后将报告用 A4纸打印装订;
第10周
以班为单位上交课程设计的资料 光盘(内含每个同学的课程设计 的源程序、编译后可直接运行的 目标程序与课程设计报告的电子 文档),课程设计报告打印稿
(2) 在 F 中选取其根结点的权值为最 小的两棵二叉树,分别作为左、 右子树构造一棵新的二叉树,并 置这棵新的二叉树根结点的权值 为其左、右子树根结点的权值之 和;
20
(3) 从F中删去这两棵树,同时加入 刚生成的新树;
(4)重复 (2) 和 (3) 两步,直至 F 中只 含一棵树为止。
21
例如: 已知权值 W={ 5, 6, 2, 9, 7 } 562 97
2
数据结构基本原理简要复习
1.数据元素之间的四种基本逻辑结构: 非线性,线性,树,图
2.数据物理表示(存储方法): 顺序存储,链式存储,索引存储,散列存储
3.算法的特征: 有穷性,可行性,确定性,正确性
算法设计的要求: 可读性,健壮性,高效性
3
4.算法的时间复杂度、空间复杂度及分析: O(1),O(n),O(logn),O(n2)
ቤተ መጻሕፍቲ ባይዱ
697
7
52
97
13
5 2 67
22
97 52
13
67
29
0
1
13 01
67 00 01
16 01
9 10
07 1
52
110 11231
三、前缀编码
指的是,任何一个字符的编码都 不是同一字符集中另一个字符的编码 的前缀。
利用赫夫曼树可以构造一种不等 长的二进制编码,并且构造所得的赫 夫曼编码是一种最优前缀编码,即使 所传电文的总长度最短。
强调的是程序要做什么?明确规定:输入的形 式和输出、值的范围;输出的形式;程序所能 达到的功能;测试的数据:包括正确的输入和 错误的输入及其相应的输出结果; 2、 概要设计
问题解决的思路概述;说明程序中用到的 所有抽象数据类型的定义,主程序的流程以及 各程序模块之间的层次(调用)关系。
11
3、 详细设计 实现概要设计中定义所有数据类型,对每
2 4
5
79
WPL(T)=
74+94+53+
42+21
=89
18
二、如何构造最优树
(赫夫曼算法) 以二叉树为例:
(1) 根据给定的 n 个权值 {w1, w2, …, wn}, 构造 n 棵二叉树的集合
F = {T1, T2, … , Tn}, 其中每棵二叉树中均只含一个带权值
为
wi
的根结点,其左、右子树为空树; 19
选做内容:求出压缩率;打印哈夫曼树;对文件夹压缩;图 形图形化窗口操作界面。 (参考教材的本题目设计指导部分的扫描页)
程序建议使用c++语言完成,建议开发工具为Microsoft Visusl C++ 2005 Express(可在微软网站免费下载)。
10
设计报告撰写指导
1、 需求分析 以无歧义的陈述说明所选设计题目的任务,
该参考教材内容丰富,尤其是C++语言 STL方面的内容,对 日后从事开发设计工作的同学有较大参考作用。但教材价 格较贵,零售价45元,因此本学期没为大家指定定购,大 家可按需购买,但建议购买。
5
STL(Standard Template Library, 标准模板库)概述
STL的一个重要特点是数据结构和算法的分离。尽管 这是个简单的概念,但这种分离确实使得STL变得非 常通用。例如,由于STL的sort()函数是完全通用的, 你可以用它来操作几乎任何数据集合,包括链表,容 器和数组。 STL另一个重要特性是它不是面向对象的。 为了具有足够通用性,STL主要依赖于模板而不是封 装,继承和虚函数(多态性)——OOP的三个要素。 STL提供了大量的模板类和函数,可以在OOP和常规 编程中使用。所有的STL的大约50个算法都是完全通 用的,而且不依赖于任何特定的数据类型。
6
STL组成
三个基本的STL组件: 1)迭代器,提供了访问容器中对象的方法。例如,可以使用一对 迭代器指定list或vector中的一定范围的对象。迭代器就如同一个 指针。事实上,C++的指针也是一种迭代器。但是,迭代器也可 以是那些定义了operator*()以及其他类似于指针的操作符地方法的 类对象。 2)容器,是一种数据结构,如list,vector,和deques ,以模板类 的方法提供。为了访问容器中的数据,可以使用由容器类输出的 迭代器。 3) 算法,是用来操作容器中的数据的模板函数。例如,STL用 sort()来对一个vector中的数据进行排序,用find()来搜索一个list中 的对象。函数本身与他们操作的数据的结构和类型无关,因此他 们可以在从简单数组到高度复杂容器的任何数据结构上使用。
24
练习题
有一份电文中共使用八种字符,频率依 次为: A(0.04),B(0.3),C(0.08),D(0.09), E(0.13),F(0.22),G(0.03),H(0.11),
请构造相应的哈夫曼树(要求树中所有 结点的左右孩子权值必须左大右小),求 出每个字符的哈夫曼编码。
25
解:
设左子树编码为0,右子树编码为1,则 A,B,C,D,E,F,G,H字符的哈夫曼编码为:A: 01010 B:00 C:0100
明显的压缩了30位码长。
27
程序设计思路
文件由若干个字节组成,一个字节有 8bits,故有28=256种字节构成形式,对应 字节码为0-255。按此256种字节出现频率 可构造haffman树进行重新编码,编码后 每 字 节 的 新 编 码 平 均 长 度 将 <=8bits , 将 每个字节对应了压缩编码写到新文件中, 从而达到压缩文件的目的。
8
STL示例——排序算法
(1)自行写排序算法与调用; (2)调用标准C++函数qsort()完成排序; (3)部分使用STL特性; (4)完全使用STL特性。
9
设计要求
基于哈夫曼树的文件压缩/解压程序
基本要求:实现一个基于哈夫曼树的文件压缩程序和文件解 压程序。要求压缩程序读入源文件,分析每种字符的频度, 然后建立相应的哈夫曼树,再求出相应哈夫曼编码,根据 编码对源文件进行压缩,得到源文件对应的压缩文件。解 压程序读入压缩文件,根据相应的哈夫曼编码解压还原 , 得到对应的源文件。