搜档网
当前位置:搜档网 › 基于哈夫曼编码的文件压缩程序设计

基于哈夫曼编码的文件压缩程序设计

基于哈夫曼编码的文件压缩程序设计

哈夫曼编码是一种经典的压缩算法,主要用于无损压缩数据。它首先根据输入文件的字符频率构建一个哈夫曼树,然后根据该树生成每个字符的编码表。根据编码表,原始文件中的字符可以被替换为较短的编码,从而实现了压缩。在解压时,可以使用相同的编码表将压缩文件恢复为原始文件。

这篇文章将介绍基于哈夫曼编码的文件压缩程序的设计。

1.文件压缩的基本思路

文件压缩的基本思路是将输入文件的字符替换为较短的编码,从而减少存储空间。首先,需要统计文件中每个字符的频率,然后根据频率构建哈夫曼树。根据哈夫曼树,生成每个字符的编码表。最后,通过编码表将原始文件的字符替换为对应的编码。压缩输出的文件包含编码表和编码后的文件内容。解压时,需要使用相同的编码表将文件解码,以还原为原始文件。

2.编码表的设计

编码表用于存储每个字符的编码。哈夫曼树的叶子节点对应于文件中的字符,从根节点到每个叶子节点的路径即为该叶子节点对应字符的编码。在编码表中,可以使用字符作为键,对应的编码作为值。在压缩时,根据编码表将字符替换为编码;在解压时,根据编码表将编码替换为字符。

3.构建哈夫曼树的算法

构建哈夫曼树的算法包括以下几个步骤:

-统计文件中每个字符的频率,并将每个字符及其频率存储在一个字典中。

-根据频率创建一个最小堆(最小优先队列)。

-将字典中的每个字符及其频率作为节点,插入到最小堆中。

-从最小堆中取出两个频率最小的节点,合并为一个新节点,该节点的频率为两个节点的频率之和。将新节点插入到最小堆中。

-重复上述步骤,直到堆中只剩下一个节点,即为根节点。

-根据哈夫曼树生成编码表。

4.文件压缩与解压的算法

文件压缩的算法包括以下几个步骤:

-读取待压缩的文件,并统计每个字符的频率。

-构建哈夫曼树,并生成编码表。

-使用编码表将原始文件中的字符替换为编码,并将压缩后的文件输出。

文件解压的算法包括以下几个步骤:

-读取压缩文件,包括编码表和编码后的文件内容。

-根据编码表,将编码替换为字符,并将解压后的文件输出。

5.程序设计和实现

基于以上思路,可以设计并实现一个基于哈夫曼编码的文件压缩程序。程序的主要模块包括文件读取模块、频率统计模块、哈夫曼树构建模块、编码表生成模块、文件压缩模块、文件解压模块等。

在设计程序时,需要考虑以下几个方面:

-选择适当的数据结构存储字符频率、哈夫曼树和编码表。

-用合适的算法实现频率统计、哈夫曼树构建和编码表生成。

-对于大文件的压缩,可以采用流式压缩,一边读取文件,一边压

缩输出。

-在文件解压时,需要根据文件中的编码表来解码文件内容。

6.总结

基于哈夫曼编码的文件压缩程序设计需要考虑文件的读取、频率

统计、哈夫曼树构建、编码表生成、文件压缩和文件解压等方面。通

过合理的算法和数据结构设计,可以实现高效的无损文件压缩和解压。此外,还可以对程序进行性能优化,提高压缩和解压的速度和效率。

哈夫曼编码课程设计

目录 1设计内容与设计要求 (1) 1.1系统的基本功能 (2) 1.2系统的设计要求 (2) 2 系统需求分析 (1) 2.1系统设计目标 (1) 2.2哈夫曼算法 (1) 3系统的实现 (3) 4 程序调试 (3) 5 总结 (3) 5.1本系统特色 (3) 5.2心得体会 (3) 附件:源程序清单 (5)

1设计内容与设计要求 1.1系统的基本功能 哈夫曼编码是根据字符出现频率对数据进行编码解码,以便对文件进行压缩的一种方法,目前大部分有效的压缩算法(如MP3编码方法)都是基于哈夫曼编码的。 数据压缩过程称为编码,也就是把文件中的每个字符均转换为一个唯一的二进制串。数据解压过程称为解码,也就是把给定的二进制位字符串转换为对应的字符。 1.2系统的设计要求 (1)数据结构可以使用结构体数组或结构体链表实现,结构体的属性可进行扩充。 (2)由用户输入相应文本。 (3)对于系统运行时,要求有相应的提示信息,方便用户进行选择。 2 系统需求分析 2.1系统设计目标 (1)哈夫曼树的建立。 (2)哈夫曼编码的生成。 (3)求出平均查找长度。 (4)用户输入权值的个数。 (5)输出的形式为整型。 (6)程序的执行可使用户在输入一列数值后,可得到由这些权值所得到的编码。 2.2 哈夫曼算法 哈夫曼算法流程如下: (1)根据给定的N个权值{W1,W2,····,WN}构成N棵二叉树的集合F={T1,T2,T3,···,Tn},其中每棵二叉树Ti中只有一个带权为Wi的根节点,其左右子树均空。 (2)在F中选取两颗根节点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值最小的树为其左右子树上根节点的权值之和。

数据结构课程设计哈夫曼树设计报告

xxxx大学xx学院 课程设计报告 课程名称:数据结构课程设计课程设计题目:哈夫曼编码译码器姓名:xxx 系:机电与信息工程系专业:计算机科学与技术年级: 学号: 指导教师: 职称: 年月日

xxxx大学xx学院课程设计结果评定 评语: 序号评定标准分值评定结果 1 课程设计报告符合规范,条理清晰,重点突出20% 2 程序实现设计方案,软件可靠性好40% 3 课程设计有自己的收获、体会、感受,等等15% 4 能够按照要求演示课程设计15% 5 有一定的创新性,难易程度10% 合计 成绩: 指导教师签字:任务下达日期:2011年月日 评定日期:

目录 1.设计任务 (1) 2.设计要求 (1) 3.设计方案 (1) 4.设计内容 (1) 4.1程序结构关系图: (2) 5.调试及运行结果 (2) 5.1程序运行结果: (3) 5.2主界面: (3) 5.3编码文件选择界面 (3) 5.4成功读取编码文件内容及编码结果保存 (4) 5.5进行哈夫曼编码 (4) 5.6进行译码操作 (5) 5.7成功读取译码文件及结果保存 (6) 5.8成功保存译码后及编码后的文件 (6) 6.总结 (7) 7.参考文献 (7) 附录一 (8)

哈夫曼编码译码器 1.设计任务 设计一个哈夫曼编码/译码系统,对一个文本文件中的字符进行哈夫曼编码,生成编码文件(压缩文件,后缀名.cod);反过来,可将一个压缩文件译码还原为一个文本文件(.txt)。 2.设计要求 1.输入一个待压缩的英文文本文件,统计文本文件中各字符的个数作为权 值,生成哈夫曼树; 2.将文本文件利用哈夫曼树进行编码,生成压缩文件(后缀名cod) 3.输入一个待解压的压缩文件名称,并利用相应的哈夫曼树将编码序列译 码; 3.设计方案 1.使用二叉树作为存储哈夫曼树; 2.使用哈希表来存储哈夫曼树的权信息; 3.提供文件打开,保存操作;并实现对文件信息进行哈夫曼编码及译码操 作。 4.设计内容

数据结构课程设计报告-哈夫曼树

计算机科学学院 数据结构课程设计 题目:基于哈夫曼树的文件压缩/解压程序 学生姓名:林华 学号:121345012021 专业:计算机科学与技术 班级:12级(2)班 指导教师姓名及职称:陈明讲师 起止时间:2014 年3 月——2014 年4 月

1 需求分析 1.1课题背景及意义 近年来,随着计算机技术的发展,多媒体计算机技术、计算机网络技术以及现代多媒体通信技术正在向着信息化、高速化、智能化迅速发展。各个领域的应用与发展,各个系统的数据量越来越大,给数据的存储、传输以及有效、快速获取信息带来了严重的障碍。数据压缩技术能够比较有效地解决这个问题。 还有在最近几年中兴起的物联网和云计算都是对海量的数据进行处理和传输的,如果不对数据进行压缩,那么数据传输所需的带宽要求就很高,物理成本上也随之上升。所以说数据压缩在计算机通信中占有很重要的位置,且涉及领域多,应用广泛,与我们的生活息息相关。 1.2课题要求 1.2.1.实现一个基于哈夫曼树的文件压缩程序和文件解压程序。 1.2.2.压缩程序能输入源文件进行压缩,输出压缩文件; 1.2.3.解压程序读入压缩文件,根据相应的哈夫曼编码解压还原,得到对应的源文件。 1.2.4.可选做:求出压缩率;打印哈夫曼树;对文件夹压缩;图形图形化窗口操作界面。 1.3任务和要求 1.3.1选择1时: 输入一个待压缩的文本文件名称(可带路径)。 如:D:\1\XXX.txt 压缩文件名称= D:\1\XXX.zip 1.3.2选择2时: 输入一个待解压的压缩文件名称(可带路径)。 如:D:\1\YYY.txt 解压文件名称=D:\1\YYY.zip

数据结构-哈夫曼编码实验报告

数据结构-哈夫曼编码实验报告 实验报告 实验课名称:数据结构实验 实验名称:文件压缩问题 班级:20132012 学号: 姓名: 时间:2015-6-9 一、问题描述 哈夫曼编码是一种常用的数据压缩技术,对数据文件进行哈夫曼编码可大大缩短文件的传输长度,提高信道利用率及传输效率。要求采用哈夫曼编码原理,统计文本文件中字符出现的词频,以词频作为权值,对文件进行哈夫曼编码以达到压缩文件的目的,再用哈夫曼编码进行译码解压缩。 二、数据结构设计 首先定义一个结构体: struct head { unsigned char b; //记录字符 long count; //权重 int parent,lch,rch; //定义双亲,左孩子,右孩子 char bits[256]; //存放哈夫曼编码的数组 } header[512],tmp; //头部一要定设置至少512个,因为结 点最多可达256,所有结点数最多可 达511 三、算法设计

输入要压缩的文件读文件并计算字符频率根据字符的频率,利用Huffman编码思想创建Huffman树由创建的Huffman树来决定字符对应的编码,进行文件的压缩解码压缩即根据Huffman树进行译码 设计流程图如图1.1所示。 建立哈夫曼树 根据哈夫曼树编根据哈夫曼树解统计字符,得出统 码计出字符的权值码 n 对二进制文件进对编码进行压缩行解码生成哈夫曼树 生成二进制文件生成对应文件 图1.1 设计流程图 (1)压缩文件 输入一个待压缩的文本文件名称(可带路径)如:D:\lu\lu.txt统计文本文件中各字符的个数作为权值,生成哈夫曼树;将文本文件利用哈夫曼树进行编码,生成压缩文件。压缩文件名称=文本文件名.COD 如:D:\lu\lu.COD压缩文件内容=哈夫曼树的核心内容+编码序列 for(int i=0;i<256;i++) { header[i].count=0; //初始化权重 header[i].b=(unsigned char)i; //初始化字符 } ifstream infile(infilename,ios::in|ios::binary); while(infile.peek()!=EOF) { infile.read((char *)&temp,sizeof(unsigned char)); //读入一个字符

用哈夫曼编码实现文件压缩实验报告【管理资料】

《用哈夫曼编码实现文件压缩》 实验报告 课程名称数据结构B 实验学期 2013 至 2014 学年第一学期学生所在系部计算机学院 年级 2013 专业班级 学生姓名学号 任课教师 实验成绩

一、实验题目: 用哈夫曼编码实现文件压缩 二、实验目的: 1、了解文件的概念。 2、掌握线性链表的插入、删除等算法。 3、掌握Huffman树的概念及构造方法。 4、掌握二叉树的存储结构及遍历算法。 5、利用Huffman树及Huffman编码,掌握实现文件压缩的一般原理。 三、实验设备与环境: 微型计算机、Windows 系列操作系统、Visual C++ 四、实验内容: 根据输入小写英文字母和输入的对应权值创建哈夫曼树,可以求出每个小写英文字母的哈夫曼编码,将文本中的字母对应的哈夫曼编码写入文本中,实现对文本的编码。 五、概要设计: (1)构造Hufffman树的Hufffman算法 构造Huffman树步骤: 1.根据给定的n个权值{w1,w2,……wn},构造n棵只有根结点的二叉树,起权 值为wj。 2.在森林中选取两棵根结点权值最小和次小的树作左右子树,构造一棵新的二 叉树,置新二叉树根结点权值为其左右子树根结点权值之和。 3.在森林中删除这两棵树,同时将新得到的二叉树加入森林中。 重复上述两步,直到只含一棵树为止,这棵树即哈夫曼树。 算法结构如图:

(2)Huffman编码:数据通信用的二进制编码 思想:根据字符出现频率编码,使电文总长最短 编码:根据字符出现频率构造Huffman树,然后将树中结点引向其左孩子的分支标“0”,引向其右孩子的分支标“1”;每个字符的编码即为从根到每个叶子的路径上得到的0、1序列。 (3) 文本编码 读取存放在文本中的字母,一对一的进行编译,将对应的编码存放到另一个文本中。 #include<> #include<> #include<> //树结点定义 typedef struct { int weight; int parent; int lchild; int rchild; }HTNode,*HuffmanTree; static char N[100];//用于保存字符 //赫夫曼编码,char型二级指针 typedef char **HuffmanCode; //封装最小权结点和次小权结点 typedef struct { int s1; int s2; }MinCode; //函数声明 void Error(); HuffmanCode HuffmanCoding(HuffmanTree &HT,HuffmanCode HC,int *w,int n); MinCode Select(HuffmanTree HT,int n); //当输入1个结点时的错误提示 void Error() {

编程为5个字符设计哈夫曼编码的方法

编程为5个字符设计哈夫曼编码的方法 编程中的哈夫曼编码是一种常见的数据压缩方法,通过构建最优二叉树来实现对字符的编码和解码。哈夫曼编码在编程中应用广泛,能够有效地减少数据传输和存储空间,提高程序效率。下面我将以深度和广度兼具的方式探讨如何为5个字符设计哈夫曼编码的方法。 1. 理解哈夫曼编码的原理 为了能够设计哈夫曼编码,我们需要深入理解哈夫曼编码的原理。哈夫曼编码是一种可变长度编码,通过构建最优二叉树来实现对字符的编码和解码。在这个过程中,出现频率较高的字符会被赋予较短的编码,而出现频率较低的字符会被赋予较长的编码,以达到压缩数据的目的。 2. 统计5个字符的频率 在设计哈夫曼编码之前,我们需要统计这5个字符在文本中出现的频率。通过遍历文本,计算每个字符出现的次数,并建立字符与频率的映射表。这一步是设计哈夫曼编码的基础,只有明确了字符的频率,才能进行下一步的最优二叉树构建。 3. 构建哈夫曼树 接下来,根据字符的频率构建哈夫曼树。首先将每个字符作为一个单独的节点,然后将这些节点依次放入优先队列中。每次从优先队列中

选取频率最小的两个节点合并成一个新的节点,直到优先队列中只剩 下一个节点为止。这个节点就是哈夫曼树的根节点,经过这个步骤, 我们就得到了哈夫曼树的结构。 4. 编码和解码 有了哈夫曼树之后,就可以根据树的结构来进行编码和解码了。在哈 夫曼树中,从根节点到每个叶子节点的路径上的编码就是对应字符的 哈夫曼编码。而解码则是根据哈夫曼树的结构和字符的编码来还原原 始字符。 总结回顾 通过以上步骤,我们就成功地设计出了5个字符的哈夫曼编码。哈夫 曼编码是一种基于字符频率的可变长度编码,通过构建最优二叉树来 实现对字符的压缩编码和解压。在编程中,哈夫曼编码能够有效地减 少数据传输和存储空间,提高程序效率。 个人观点和理解 在编程中设计哈夫曼编码需要深入理解哈夫曼编码的原理和构建过程。首先要对字符频率进行统计,然后构建哈夫曼树,最后进行编码和解码。通过这个过程,能够更好地理解哈夫曼编码的精髓和优势,并能 够灵活应用到实际的编程中。 在编程中,哈夫曼编码往往被用于数据压缩和解压,能够大大减少数

关于哈夫曼编码的程序设计报告

关于哈夫曼编码的程序设计报告 第一部分:引言 1. 关于哈夫曼编码的程序设计报告 在现代社会中,信息的传输和存储已经成为了我们生活中不可或缺的 一部分。在数字化时代,我们经常需要对数据进行编码和解码,以便 有效地传输和存储信息。而哈夫曼编码作为一种有效的数据压缩方式,被广泛应用于通信、计算机科学和信息处理领域。 在本篇文章中,我将从程序设计的角度进行深入探讨哈夫曼编码的原理、实现和应用。我将带领你一起了解哈夫曼编码的本质,探讨其在 实际应用中的价值,以及我个人对于哈夫曼编码的理解和观点。 第二部分:哈夫曼编码的原理与实现 2. 原理概述 哈夫曼编码是一种变长编码方式,通过统计文本中字符出现的频率, 构建一颗最优二叉树,将出现频率高的字符用较短的编码表示,而出 现频率低的字符用较长的编码表示,从而实现了对数据的高效压缩和 解压缩。 3. 算法流程

哈夫曼编码的算法流程主要包括构建哈夫曼树、生成编码表和进行编 码解码三个步骤。在构建哈夫曼树时,需要通过优先队列或堆来实现 最小频率字符的选择和合并,然后生成编码表,最后进行编码和解码 操作。 4. 实现技巧 在实际的程序设计中,优化哈夫曼编码的实现是非常重要的。例如采 用树结构、位操作以及内存管理等技巧可以有效提高哈夫曼编码的性 能和效率。 第三部分:哈夫曼编码的应用 5. 通信领域 在通信领域中,哈夫曼编码被广泛应用于数据传输和网络通信中。通 过哈夫曼编码可以实现对数据的高效压缩,从而节省带宽和传输成本。 6. 储存领域 在储存领域中,哈夫曼编码也能够帮助我们实现对数据的高效压缩和 解压缩,节省存储空间并提高储存效率。特别是在大数据和云计算时代,哈夫曼编码的应用更是显得尤为重要。 第四部分:个人观点与理解 7. 我的观点 在我看来,哈夫曼编码作为一种高效的数据压缩算法,为我们在通信、

利用Matlab进行数据压缩与解压缩

利用Matlab进行数据压缩与解压缩 数据压缩与解压缩是信息技术领域中一项重要的工作,它可以帮助我们减少数据的存储空间和传输带宽,提高数据的传输速度和存储效率。而Matlab作为一种功能强大的数学软件,也提供了多种方法和工具来进行数据压缩与解压缩的操作。本文将介绍如何利用Matlab进行数据压缩与解压缩的过程,并探讨一些常用的压缩算法与技术。 一、数据压缩的概念与重要性 数据压缩是将原始数据通过一定的算法和技术,使得压缩后的数据在占用存储空间或者传输带宽上减少,但保持原始数据的一些重要特征。数据压缩有着广泛的应用场景,比如在图像和视频处理中,我们经常需要对大量的图像和视频数据进行传输和存储,若能将这些数据压缩后再传输和存储,就能大大提高传输效率和节省存储空间。 二、Matlab的数据压缩与解压缩函数 Matlab提供了多种数据压缩与解压缩的函数和工具箱,其中最常见的有gzip、zlib、zip等函数。gzip函数可以将一个或多个文件压缩成一个gzip格式的文件,zlib函数可以将一个或多个文件压缩成一个zlib格式的文件,zip函数则可以将一个或多个文件压缩成一个zip格式的文件。这些函数的使用方法非常简单,只需传入待压缩文件的路径和压缩文件的路径即可进行压缩和解压缩。 三、常用的数据压缩算法 1. 哈夫曼编码 哈夫曼编码是一种可变字长编码技术,它根据每个符号(或字符)出现的概率来赋予该符号的编码,出现概率高的符号会被赋予较短的编码,出现概率低的符号会被赋予较长的编码。在Matlab中,可以使用huffmandict函数生成哈夫曼编码的

字典,使用huffmanenco函数对数据进行编码,使用huffmandeco函数对数据进行解码。 2. Lempel-Ziv-Welch(LZW)算法 LZW算法是一种基于词典的无损压缩算法,它的主要思想是将连续出现的字符序列映射为一个索引,并将该索引存储起来,从而达到压缩数据的目的。在Matlab中,可以使用lzwenco函数对数据进行LZW编码,使用lzwdeco函数对数据进行LZW解码。 3. 等重量哈希算法 等重量哈希算法是一种通过对原始数据进行变换,使得压缩数据的统计特性达到一定的要求,从而实现数据压缩的技术。在Matlab中,可以使用eqweight函数对数据进行等重量哈希编码,使用eqdeco函数对数据进行等重量哈希解码。 四、数据压缩与解压缩演示 下面我们将用一个简单的例子来演示Matlab的数据压缩与解压缩功能。假设我们有一幅512x512的灰度图像,首先我们使用gzip函数对图像进行压缩,并将压缩后的数据保存为gzip格式的文件。接着,我们使用gzip函数对gzip格式的文件进行解压缩,并将解压缩后的数据保存为解压缩后的图像文件。最后,我们可以使用imfinfo函数查看原始图像文件和解压缩后的图像文件的信息,并通过计算它们之间的均方误差来评估压缩和解压缩的效果。 五、总结与展望 数据压缩与解压缩是一项重要的技术,在信息技术领域中有着广泛的应用。本文介绍了如何利用Matlab进行数据压缩与解压缩的过程,并探讨了一些常用的压缩算法与技术。然而,数据压缩与解压缩领域仍然存在许多挑战和问题,如如何提高压缩和解压缩的效率,如何选取适合不同数据类型的压缩算法等。相信随着技术

哈夫曼编码设计原理

哈夫曼编码设计原理 哈夫曼编码(HuffmanCoding)是一种十分重要的信息压缩编码技术,它能够给予信息流最有效的编码,一般情况下它能够实现信息量的压缩,从而节省载体存储和信息传输的带宽和时间。因此,哈夫曼编码是许多数据传输、压缩和存储应用中不可缺少的一部分。 哈夫曼编码基于信息熵的概念,是由美国著名科学家卡尔哈夫曼在1952年提出来的,他提出了一种构建最优编码树的算法,这种编码树也被称为哈夫曼树。 哈夫曼编码原理基于概率编码理论,该理论规定是:为了实现最优编码,必须给出根据待编码字符及其出现概率给出的编码的编码顺序,以此构建哈夫曼树,来实现最优编码。哈夫曼树的构建方法如下: 1)计算每个字符的概率,并按从大到小的顺序排列。 2)选择概率最小的两个字符,合并成一个新的结点,结点概率为两者概率之和,新形成的结点也排在概率队列的最后。 3)重复上述过程,直到所有的字符都被归入一个结点中,得到一棵哈夫曼树。 值得注意的是,哈夫曼编码的最优性能实际上是由哈夫曼树的构建方法来实现的,而哈夫曼树的构建是基于概率编码理论的基础上进行的,因此,只有给定有限规模的字符集,而且这些字符出现的概率必须符合概率编码理论,哈夫曼编码才能正常工作,从而达到压缩效果。 此外,哈夫曼编码还有许多其他优势,比如它可以实现稳定性和

循环利用性,并且可以根据不同的信息实时分析和更新,从而达到准确无误的编码效果。此外,由于它的编码方案是可以被逆向变换的,因此,解码的效果也能够超过预想的期望,从而使得解码效率得到显著提高。 总之,哈夫曼编码的实际应用使得它在信息压缩、数据传输以及数据存储等领域发挥着至关重要的作用。它能够有效减少信息量,帮助节省带宽,使传输成本大大降低,从而提高数据传输和存储的效率,并能够释放更多的内存空间,从而提高信息传输的速度,大大改善数据传输的效率。

哈夫曼编码程序代码

#include #include #include #include #include typedef struct{ char ch; int weight; int parent,lchild,rchild; }htnode,*hfmtree; typedef char **hfmcode; void Select(hfmtree &HT,int a,int *p1,int *p2) { int i,j,x,y; for(j=1;j<=a;++j){ if(HT[j].parent==0){ x=j; break; } } for(i=j+1;i<=a;++i){ if(HT[i].weighty){ *p1=y; *p2=x; }

else { *p1=x; *p2=y; } } void hfmcoding(hfmtree &HT,hfmcode &HC,int n) { int i,start,c,f,m,w; int p1,p2; char *cd,z; if(n<=1){ return; } m=2*n-1; HT=(hfmtree)malloc((m+1)*sizeof(htnode)); for(i=1;i<=n;++i) { printf("请输入第%d字符信息和权值:",i); scanf("%c%d",&z,&w); while(getchar()!='\n') { continue; } HT[i].ch=z; HT[i].weight=w; HT[i].parent=0; HT[i].lchild=0; HT[i].rchild=0; } for(;i<=m;++i) { HT[i].ch='0'; HT[i].weight=0; HT[i].parent=0; HT[i].lchild=0; HT[i].rchild=0; } for(i=n+1;i<=m;++i) { Select(HT,i-1,&p1,&p2); HT[p1].parent=i;HT[p2].parent=i; HT[i].lchild=p1;HT[i].rchild=p2;

哈夫曼压缩算法

一、总体设计 目标设计 设计题目: 利用哈夫曼算法进行文件的压缩和解压缩。 基本功能: 利用命令行对指定的文件进行压缩和解压缩。 输入格式为: course(程序名)<[-c] [-d] [-?]>(参数:分别对应压缩、解压缩、帮助)<原文件名> <目标文件名> 指标要求: 能对一般的文本文件有较好的压缩能力,对其它格式文件可以进行压缩但不一定能有压缩效果。对于用此程序压缩的文件可以用此程序解压回原文件。 框架设计 由于此程序主要任务为压缩和解压缩,故整个程序由这两个大的模块构成。 压缩需要的步骤为: 1.统计所压缩文件的字符频率分布;根据上步分布创建哈夫曼树; 2.把哈夫曼树的对应结点的父结点下标(256到510)减去256形成一个字节 的整型数写入新建文件,并预留一个字节位置给最后的一个有效位数; 3.利用哈夫曼树对该文件进行逐个字节的编码,把编码每8位转换成一个字节 写入新的文件,最后不够8位的补0充满8位写入文件,并得到一个有效位数; 4.重新定位那个预留的位置,把有效位数存在这个位置。 解压缩需要的步骤为: 1.打开要解压的程序,读文件头的512个字节,把前511个字节还原为哈夫曼 树待用,第512个字节存到一个变量中去; 2.然后逐个字节进行读取,把0-255的十进制整数转化为二进制数,利用这 些二进制数从哈夫曼树的根结点(下标为510)出发,0走左子,1走右子,找到叶子结点,把该叶子结点的下标写入新文件,最后处理有效位数不满8位的字节。

以上是主要的模块及其基本功能,基本都单独设为函数,通过参数来传递信息二、详细设计 数据结构设计 由于此压缩程序是利用哈夫曼编码进行工作的,用到的最主要的数据结构就是哈夫曼树了,物理结构采用静态三叉链来表示,以每个文件中字节的出现次数为权值创建此哈夫曼树,对每个叶子结点进行编码,一般对于权值公布不太均匀的文件编码后的长度要短一些,故可以起到压缩的目的。解压则是从根根据文件二进制代码进行访叶,对应的叶子就是原文件了。 此外还用多次用到了栈和队列,例如解压读文件时需要将十进制数转化为二进制数,用到了栈,十进制数模除2所得的余数存到栈中,出栈后顺序就是所要的二进制代码的顺序。 队列也是用在了解压的过程中,由于有最后有效位数不是8位的情况,我不能预先知道什么时候读到最后一位,所以我用了一个队列把每次读到的字节先放到队列中去,当其中的数据大于等于2的时候再拿出来处理,这样当文件读完的时候队列中应该还剩下一个字节未被处理,这样就可以断定这个字节就是有效位数不足8位的了。

【报告】多媒体数据压缩实验报告

【关键字】报告 多媒体数据压缩实验报告 篇一:多媒体实验报告_文件压缩 课程设计报告 实验题目:文件压缩程序 姓名:指导教师:学院:计算机学院专业:计算机科学与技术学号: 提交报告时间:20年月日 四川大学 一,需求分析: 有两种形式的重复存在于计算机数据中,文件压缩程序就是对这两种重复进行了压 缩。 一种是短语形式的重复,即三个字节以上的重复,对于这种重复,压缩程序用两个数字:1.重复位置距当前压缩位置的距离;2.重复的长度,来表示这个重复,假设这两个数字各占一个字节,于是数据便得到了压缩。 第二种重复为单字节的重复,一个字节只有256种可能的取值,所以这种重复是必然的。给256 种字节取值重新编码,使出现较多的字节使用较短的编码,出现较少的字节使用较长的编码,这样一来,变短的字节相对于变长的字节更多,文件的总长度就会减少,并且,字节使用比例越不均匀,压缩比例就越大。 编码式压缩必须在短语式压缩之后进行,因为编码式压缩后,原先八位二进制值的字节就被破坏了,这样文件中短语式重复的倾向也会被破坏(除非先进行解码)。另外,短语式压缩后的结果:那些剩下的未被匹配的单、双字节和得到匹配的距离、长度值仍然具有取值分布不均匀性,因此,两种压缩方式的顺序不能变。 本程序设计只做了编码式压缩,采用Huffman编码进行压缩和解压缩。Huffman编码是一种可变长编码方式,是二叉树的一种特殊转化形式。编码的原理是:将使用次数多的代码转换成长度较短的代码,而使用次数少的可以使用较长的编码,并且保持编码的唯一可解性。根据ascii 码文件中各ascii 字符出现的频率情况创建Huffman 树,再将各字符对应的哈夫曼编码写入文件中。同时,亦可根据对应的哈夫曼树,将哈夫曼编码文件解压成字符文件. 一、概要设计: 压缩过程的实现: 压缩过程的流程是清晰而简单的: 1. 创建Huffman 树 2. 打开需压缩文件 3. 将需压缩文件中的每个ascii 码对应的huffman 编码按bit 单位输出生成压缩文件压缩结束。 其中,步骤1和步骤3是压缩过程的关键。 ? 步骤1:这里所要做工作是得到Huffman数中各叶子结点字符出现的频率并进行创建.统计字符出现的频率可以有很多方法:如每次创建前扫描被创建的文件,“实时”的生成各字符的出现频率;或者是创建前即做好统计.这里采用的是前一种方法。

数据结构课程设计哈夫曼编码

《数据结构与算法》课程设计(2009/2010学年第二学期第20周) 指导教师:*** 班级:计算机科学与技术(3)班 学号: 姓名:

《数据结构与算法》课程设计 目录 一、前言 1.摘要 2.《数据结构与算法》课程设计任务书 二、实验目的 三、题目--赫夫曼编码/译码器 1.问题描述 2.基本要求 3.测试要求 4.实现提示 四、需求分析--具体要求 五、概要设计 六、程序说明 七、详细设计 八、实验心得与体会

前言 1.摘要 随着计算机的普遍应用与日益发展,其应用早已不局限于简单的数值运算,而涉及到问题的分析、数据结构框架的设计以及设计最短路线等复杂的非数值处理和操作。算法与数据结构的学习就是为以后利用计算机资源高效地开发非数值处理的计算机程序打下坚实的理论、方法和技术基础。 算法与数据结构旨在分析研究计算机加工的数据对象的特性,以便选择适当的数据结构和存储结构,从而使建立在其上的解决问题的算法达到最优。 数据结构是在整个计算机科学与技术领域上广泛被使用的术语。它用来反映一个数据的内部构成,即一个数据由那些成分数据构成,以什么方式构成,呈什么结构。数据结构有逻辑上的数据结构和物理上的数据结构之分。逻辑上的数据结构反映成分数据之间的逻辑关系,而物理上的数据结构反映成分数据在计算机内部的存储安排。数据结构是数据存在的形式。 《数据结构》主要介绍一些最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。 学习数据结构是为了将实际问题中所涉及的对象在计算机中表示出来并对它们进行处理。通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。 2.《数据结构与算法》课程设计任务书 《数据结构与算法》是计算机专业重要的核心课程之一,在计算机专业的学习过程中占有非常重要的地位。《数据结构与算法课程设计》就是要运用本课程以及到目前为止的有关课程中的知识和技术来解决实际问题。特别是面临非数值计算类型的应用问题时,需要选择适当的数据结构,设计出满足一定时间和空间限制的有效算法。 本课程设计要求同学独立完成一个较为完整的应用需求分析。并在设计和编写具有一定规模程序的过程中,深化对《数据结构与算法》课程中基本概念、理论和方法的理解;训练综合运用所学知识处理实际问题的能力,强化面向对象的程序设计理念;使自己的程序设计与调试水平有一个明显的提高。

英文文件的压缩和解压缩程序

合肥学院 计算机科学与技术系 一、问题分析和任务定义 1、题目 采用哈夫曼编码思想实现英文文本的压缩与解压缩,并提供压缩前后的占用空间比。 要求 1)压缩原文件规模不小于5K 2) 提供解压缩文件后文件与原文件的相同性比较功能 2、问题分析 压缩过程 news.txt →news1.txt 1、以读的形式打开需要压缩的一个英文本文件,把其中出现的所有字符按其在文本中出现的频率利用哈夫曼树进行编码。 2、以写的形式打开一个新的文本文件,把它作为英文文本压缩后的文本文件,扫描需要压缩的英英文本文件( new.txt )中所有字符,把其对应的编码通过转换后存入新的文本文件( new1.txt )中。 3、把需要压缩的英文文本( new.txt )中所出现的字符及其编码等原始文件的信息保存在新的文本文件中。 解压缩过程news1.txt →news2.txt 1、以读的形式打开一个压缩文件 news1.txt,按其中保存的原始文件的信息还原哈夫曼树及字符编码。 2、以写的形式打开一个新的文本文件,作为解压后的英文文本 news2.txt ,逐个扫描压缩文件 news1.txt中的所有字符,把其中所有转换后的编码再转换回来并与哈夫曼树中存储的字符编码比较,把其对应的字符写入news2.txt 中。 一个字符在文本文件中存储时占一个字节,而其二进制编码若直接存入文本文件其所占的空间不会少于一个字节。例如:假设字符E的编码为001,若把001直接存入文件只能用字符串的形式,其所占用的空间为三个字节。达不到文件压缩的目的,所以必须对编码的存储空间进行转换。 3 编码转换 在文本文件中字符之间是连续的,所以在文本文件中存储编码也是连续的。可以把连续的不同字符的编码存入同一个字节,再把这一个字节的二进制码转换成一个字符,把转换后的字符存储在文本文件中。 二、数据结构的选择和概要设计: 1 此程序采用的数据结构为顺序表。哈夫曼树是二叉树的一种,二叉树的顺序存储结构中可以把结点间的关系放在其存储位置中,无需附加任何信息就能在这种结构中找到每个结点的双亲结点和孩子结点,这正是哈夫曼编码所需要的。 哈夫曼树顺序表:结构体header[512],表中每个结点包括以下信息

哈夫曼编码压缩解压缩

哈夫曼编码压缩解压缩 xx学院 课程设计题目哈夫曼编码压缩解压缩 院系名称计算机科学与技术系 专业(班级) 姓名(学号) 指导教师 完成时间 1 哈夫曼编码实现文本文件的压缩和解压缩一、任务分析和定义 在了解哈夫曼编码压缩解压缩原理之前,首先让我们来认识哈夫曼树和哈夫曼编码。 1.在了解哈夫曼编码压缩解压缩原理之前,首先让我们来认识哈夫曼树。哈夫曼树又称最 优二叉树,是带权路径长度最小的二叉树。 2.在文本文件中多采用二进制编码。为了使文件尽可能的缩短, 可以对文件中每个字符出 现的次数进行统计。设法让出现次数多的字符二进制码短些, 而让那些很少出现的字符 二进制码长一些。若对字符集进行不等长编码,则要求字符集中任一字符的编码都不是 其它字符编码的前缀。为了确保哈夫曼编码的唯一性,我们可以对它的左右子树的大小

给予比较限定,如:左子树的权值小于右子树的权值。哈夫曼树中的左右分支各代表‘0’ 和‘1’,则从根节点到叶子节点所经历的路径分支上的‘0’或‘1’组成的字符串,为 该节点对应字符的哈夫曼编码。 3.统计字符集中每个字符在文件中出现的平均概率(概率越大,要求编码越短)。利用哈 夫曼树的特点:权越大的叶子离根越近,将每个字符的概率值作为权值,构造哈夫曼树。 则概率越大的结点,路径越短。哈夫曼译码是从二进制序列的头部开始,顺序匹配成共 的部分替换成相应的字符,直至二进制转换为字符序列。 4.哈夫曼用于文件解压缩的基础是在压缩二进制代码的同时还必须存储相应的编码,这样就可以根据存储的哈夫曼编码对压缩代码进行解压缩。总之,该课题的任务应该是首先要打开要压缩的文本文件并读出其中字符出现的频率,以其为权值构建哈夫曼树。其次要找到构建压缩功能的方法,在构建哈夫曼树的基础上进行编码, 改变字符原先的存储结构,以达到压缩文件的目的,此外还要存储相应的哈夫曼编码,为解 压缩做准备。 二、概要设计和数据结构的选择 以下是在任务分析及对题意的理解做出的概要设计和对数据结构的选择。 1.数据结构定义: struct head

(完整word版)数据结构课程设计(哈夫曼编码)

┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊ 目录 目录 (1) 1 课程设计的目的和意义 (2) 2 需求分析 (3) 3 系统设计 (4) (1)设计思路及方案 (4) (2)模块的设计及介绍 (4) (3)主要模块程序流程图 (6) 4 系统实现 (10) (1)主调函数 (10) (2)建立HuffmanTree (10) (3)生成Huffman编码并写入文件 (13) (4)电文译码 (14) 5 系统调试 (16) 小结 (18) 参考文献 (19) 附录源程序 (20)

┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊ 1 课程设计的目的和意义 在当今信息爆炸时代,如何采用有效的数据压缩技术来节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视。哈夫曼编码正是一种应用广泛且非常有效的数据压缩技术。 哈夫曼编码的应用很广泛,利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1”的序列作为和各个对应的字符的编码,这就是哈夫曼编码。 通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。电报通信是传递文字的二进制码形式的字符串。但在信息传递时,总希望总长度尽可能最短,即采用最短码。 作为软件工程专业的学生,我们应该很好的掌握这门技术。在课堂上,我们能过学到许多的理论知识,但我们很少有过自己动手实践的机会!课程设计就是为解决这个问题提供了一个平台。 在课程设计过程中,我们每个人选择一个课题,认真研究,根据课堂讲授内容,借助书本,自己动手实践。这样不但有助于我们消化课堂所讲解的内容,还可以增强我们的独立思考能力和动手能力;通过编写实验代码和调试运行,我们可以逐步积累调试C程序的经验并逐渐培养我们的编程能力、用计算机解决实际问题的能力。 在课程设计过程中,我们不但有自己的独立思考,还借助各种参考文献来帮助我们完成系统。更为重要的是,我们同学之间加强了交流,在对问题的认识方面可以交换不同的意见。同时,师生之间的互动也随之改善,我们可以通过具体的实例来从老师那学到更多的实用的知识。 数据结构课程具有比较强的理论性,同时也具有较强的可应用性和实践性。课程设计是一个重要的教学环节。我们在一般情况下都能够重视实验环节,但是容易忽略实验的总结,忽略实验报告的撰写。通过这次实验让我们明白:作为一名大学生必须严格训练分析总结能力、书面表达能力。需要逐步培养书写科学实验报告以及科技论文的能力。只有这样,我们的综合素质才会有好的提高。

相关主题