数据结构文件压缩

合集下载

Redis缓存的数据压缩和序列化方法

Redis缓存的数据压缩和序列化方法

Redis缓存的数据压缩和序列化方法数据压缩和序列化对于Redis缓存的性能和效率至关重要。

本文将介绍Redis缓存中常用的数据压缩和序列化方法,包括压缩算法和序列化协议的选择,以及实现这些方法的步骤。

一、数据压缩方法数据压缩是将原始数据通过特定算法进行压缩,减少数据量以提高存储和传输效率。

在Redis缓存中,常用的数据压缩方法包括Gzip和Lzf。

1. Gzip压缩方法Gzip是一种常见的压缩算法,能够有效地压缩文本和二进制数据。

在Redis中使用Gzip进行数据压缩的步骤如下:(1)安装Gzip库:首先需要在服务器上安装Gzip库,以便使用Gzip算法。

(2)配置Redis服务器:在Redis服务器的配置文件中,将压缩选项设置为启用,并指定使用Gzip算法进行压缩。

(3)压缩和解压缩数据:在应用程序中,使用Gzip算法对需要存储到Redis缓存的数据进行压缩,或者从Redis缓存中获取数据后解压缩。

2. Lzf压缩方法Lzf是一种高效的压缩算法,特别适用于压缩简单的文本数据。

在Redis中使用Lzf进行数据压缩的步骤类似于Gzip:(1)安装Lzf库:在服务器上安装Lzf库,以便使用Lzf算法。

(2)配置Redis服务器:在Redis服务器的配置文件中,将压缩选项设置为启用,并指定使用Lzf算法进行压缩。

(3)压缩和解压缩数据:在应用程序中,使用Lzf算法对需要存储到Redis缓存的数据进行压缩,或者从Redis缓存中获取数据后解压缩。

二、数据序列化方法数据序列化是将对象或数据结构转换成字节流,以便在不同的应用程序之间进行传输和存储。

在Redis缓存中,常用的数据序列化方法包括JSON、MessagePack和Protobuf。

1. JSON序列化方法JSON是一种轻量级的数据交换格式,常用于Web应用程序中的数据传输。

在Redis中使用JSON进行数据序列化的步骤如下:(1)选择合适的JSON库:根据编程语言的不同,选择适合的JSON库进行序列化和反序列化操作。

数据结构中的数据压缩技术

数据结构中的数据压缩技术

数据结构中的数据压缩技术数据压缩技术是数据结构中一个重要的应用领域,它通过一系列算法和方法,将原始数据转换为更紧凑的形式,以减少存储空间和传输带宽的消耗。

在计算机科学领域,数据压缩技术被广泛应用于文件存储、网络传输、多媒体处理等方面。

本文将介绍数据结构中常见的数据压缩技术,包括无损压缩和有损压缩两种类型。

一、无损压缩无损压缩是指在数据压缩的过程中,不丢失任何原始数据信息,通过一定的编码方式将数据表示为更紧凑的形式。

常见的无损压缩算法包括:1. 霍夫曼编码(Huffman Coding)霍夫曼编码是一种基于字符出现频率的编码方式,出现频率高的字符用较短的编码表示,出现频率低的字符用较长的编码表示,从而实现对数据的压缩。

霍夫曼编码是一种前缀编码,即任何一个字符的编码都不是另一个字符编码的前缀,这样可以避免编码歧义。

霍夫曼编码在文件压缩、通信传输等领域有着广泛的应用。

2. LZW压缩算法(Lempel-Ziv-Welch Compression)LZW压缩算法是一种基于字典的压缩算法,通过维护一个动态字典来实现数据的压缩。

算法首先将输入的数据序列划分为不同的子串,然后将子串映射为字典中的索引,从而实现对数据的压缩。

LZW算法在图像压缩、文本压缩等领域有着广泛的应用。

3. 等长编码(Run-Length Encoding)等长编码是一种简单有效的无损压缩算法,它通过统计连续重复出现的数据值,将重复的数据值用一个计数值和一个数据值的形式表示,从而实现对数据的压缩。

等长编码在处理连续重复数据较多的情况下有着较好的压缩效果。

二、有损压缩有损压缩是指在数据压缩的过程中,会丢失部分原始数据信息,但通过牺牲一定的精度和质量来实现更高的压缩比。

常见的有损压缩算法包括:1. JPEG压缩算法(Joint Photographic Experts Group)JPEG是一种常用的图像压缩算法,它通过离散余弦变换(DCT)将图像数据转换为频域表示,然后对频域数据进行量化和熵编码,最终实现对图像的压缩。

C语言中的数据压缩与解压缩

C语言中的数据压缩与解压缩

C语言中的数据压缩与解压缩在计算机科学中,数据压缩是一种常见的技术,用于将大型数据文件或数据流以更小的尺寸存储或传输。

在C语言中,我们可以使用各种算法和技术来实现数据的压缩和解压缩。

本文将详细介绍C语言中常用的数据压缩与解压缩方法。

一、哈夫曼编码1.1 简介哈夫曼编码是一种无损压缩算法,由数学家David A. Huffman于1952年提出。

它根据数据中字符出现的频率来构建一个具有最小编码长度的前缀码。

在C语言中,我们可以使用哈夫曼编码来进行数据的压缩和解压缩。

1.2 压缩过程哈夫曼编码的压缩过程分为以下几个步骤:a) 统计数据中各字符的频率,构建字符频率表。

b) 根据字符频率表构建哈夫曼树。

c) 根据哈夫曼树构建字符编码表。

d) 遍历数据,使用字符编码表将字符转换为对应的编码,并将编码存储。

1.3 解压缩过程哈夫曼编码的解压缩过程分为以下几个步骤:a) 使用压缩时生成的字符编码表,将压缩后的编码转换为对应的字符。

b) 将解压后的字符恢复为原始数据。

二、LZ77压缩算法2.1 简介LZ77是一种常用的数据压缩算法,由Abraham Lempel和Jacob Ziv 于1977年提出。

它利用了数据中的重复出现模式,通过记录重复出现的字符串的位置和长度来实现数据的压缩。

2.2 压缩过程LZ77压缩算法的压缩过程分为以下几个步骤:a) 初始化一个滑动窗口,窗口大小为固定长度。

b) 在滑动窗口内查找与当前字符匹配的最长字符串,并记录字符串的位置和长度。

c) 将匹配的字符串以位置和长度的形式存储,并将窗口向右滑动到匹配字符串的末尾。

d) 重复步骤b和c,直到遍历完所有数据。

2.3 解压缩过程LZ77压缩算法的解压缩过程分为以下几个步骤:a) 根据压缩时存储的位置和长度信息,从滑动窗口中找到对应的字符串。

b) 将找到的字符串输出,并将窗口向右滑动到输出字符串的末尾。

c) 重复步骤a和b,直到解压缩完成。

三、LZ78压缩算法3.1 简介LZ78是一种常用的数据压缩算法,由Abraham Lempel和Jacob Ziv 于1978年提出。

Python数据压缩

Python数据压缩

Python数据压缩数据压缩在计算机科学中是一个常见的概念,它指的是通过消除冗余信息,减小数据的体积以节省存储空间或者传输时间的过程。

Python 作为一种功能强大的编程语言,也提供了多种数据压缩的方法和工具。

本文将介绍Python中常用的数据压缩技术和相关的库。

1. 压缩算法数据压缩的核心就是一系列压缩算法,Python提供了多种压缩算法的实现。

下面介绍其中两种常用的压缩算法。

1.1. Huffman压缩算法Huffman压缩算法是一种基于字符频率的压缩算法。

它通过构建Huffman树来实现对字符的编码和解码。

Python的`huffman`库提供了对文本数据进行Huffman编码和解码的功能,使用简单且效率较高。

1.2. Lempel-Ziv-Welch (LZW) 压缩算法LZW压缩算法是一种基于字典的压缩算法。

它通过不断地向字典中添加新的编码来实现对数据的压缩。

Python的`lz4`库是一个快速且高效的LZW压缩库,可以对各种类型的数据进行压缩和解压缩。

2. 压缩库除了以上介绍的压缩算法,Python还提供了一些方便实用的压缩库,可以方便地进行数据压缩和解压缩操作。

2.1. zlibzlib是Python内置的一个压缩库,提供了对数据进行压缩和解压缩的功能。

它支持多种压缩算法,包括DEFLATE(通常用于gzip和zip 文件格式)、LZ77和Huffman编码。

使用zlib库,你可以简单地将数据压缩为字节流或者解压缩已经压缩的字节流。

2.2. zipfilezipfile是Python标准库中提供的一个用于处理zip文件的模块。

它可以用于创建、读取、写入和解压缩zip文件。

通过zipfile库,你可以方便地将多个文件打包成一个zip文件,并且可以选择是否进行数据压缩。

3. 应用实例数据压缩在实际应用中有很多用途,在以下几个方面可以得到广泛的应用。

3.1. 文件压缩数据压缩最常见的应用就是对文件进行压缩。

哈夫曼树的实际应用

哈夫曼树的实际应用

哈夫曼树的实际应用
哈夫曼树(Huffman Tree)是一种重要的数据结构,它在信息编码和压缩、数据传输和存储、图像处理等领域有广泛应用。

1. 数据压缩:哈夫曼树是一种无损压缩的方法,能够有效地减小数据的存储空间。

在进行数据压缩时,可以使用哈夫曼树构建字符编码表,将出现频率较高的字符用较短的编码表示,而出现频率较低的字符用较长的编码表示,从而减小数据的存储空间。

2. 文件压缩:在文件压缩领域,哈夫曼树被广泛应用于压缩算法中。

通过构建哈夫曼树,可以根据字符出现的频率来生成不同长度的编码,从而减小文件的大小。

常见的文件压缩格式如ZIP、GZIP等都使用了哈夫曼树。

3. 图像压缩:在图像处理中,哈夫曼树被用于图像压缩算法中。

通过将图像中的像素值映射为不同长度的编码,可以减小图像的存储空间,提高图像传输和存储的效率。

常见的图像压缩格式如JPEG、PNG等都使用了哈夫曼树。

4. 文件传输:在数据传输中,哈夫曼树被用于数据压缩和传输。

通过对数据进行压缩,可以减小数据的传输时间和带宽占用。

在传输过程中,接收方可以通过哈夫曼树解码接收到的数据。

5. 数据加密:在数据加密中,哈夫曼树可以用于生成密钥,从而实现数据的加密和解密。

通过将字符映射为不同长度的编码,可以实
现对数据的加密和解密操作。

哈夫曼树在信息编码和压缩、数据传输和存储、图像处理等领域有广泛应用,能够有效地减小数据的存储空间、提高数据传输效率、实现数据加密等功能。

数据结构-哈夫曼树实验报告(包含文件压缩)

数据结构-哈夫曼树实验报告(包含文件压缩)

2008级数据结构实验报告实验名称:实验三——实现哈夫曼树学生姓名:***班级:**********班内序号:**学号:********日期:2009年11月14日1.实验要求利用二叉树结构实现赫夫曼编/解码器。

基本要求:1、初始化(Init):能够对输入的任意长度的字符串s进行统计,统计每个字符的频度,并建立赫夫曼树2、建立编码表(CreateTable):利用已经建好的赫夫曼树进行编码,并将每个字符的编码输出。

3、编码(Encoding):根据编码表对输入的字符串进行编码,并将编码后的字符串输出。

4、译码(Decoding):利用已经建好的赫夫曼树对编码后的字符串进行译码,并输出译码结果。

5、打印(Print):以直观的方式打印赫夫曼树(选作)6、计算输入的字符串编码前和编码后的长度,并进行分析,讨论赫夫曼编码的压缩效果。

测试数据:I love data Structure, I love Computer。

I will try my best to study data Structure.提示:1、用户界面可以设计为“菜单”方式:能够进行交互。

2、根据输入的字符串中每个字符出现的次数统计频度,对没有出现的字符一律不用编码。

2. 程序分析2.1 存储结构在哈夫曼树编码这个程序中,所有数据用的存储结构都是顺序存储结构,其中包括顺序表和树(三叉树)。

树的存储结构如下:(输入的字符串为assddddffffffffgggggggggggggggg)上结构图中,填充为黄色的部分为写入内存中的部分。

每一行的部分为数组的下标,左边部分为所定义的结构的成员。

其中有的结点的父节点的下标是一个负数,用来说明该节点是该节点的父节点的左孩子,正数说明的是该节点的父节点的右孩子。

父节点这零的节点说明该节点是该哈夫曼树的根节点。

画出树的结构如下画所示:(结点中第一个数表示这个字符的ASCⅡ编码,第二个数字表示权值)红色箭头表示父指针,黑色箭头表示孩子指针由上面的图可知,原字符串编码后的二进制编码为11101111111111011011011010101010101010100000000000000000字符串中出现的所有的字符的编码如下:a 1110 ;s 1111 ; d 110 ; f 10 ;g 02.2 关键算法分析算法1:哈夫曼树的构造这个算法分两个部分,每一个部分是对一个字符串中每个字符出现次数的统计,并为每一个出现的字符建立一个叶子节点;第二个部分是以上面的统计的数据为依据建立起一棵哈夫曼树。

数据结构课程设计_哈夫曼压缩文件

数据结构课程设计_哈夫曼压缩文件

《数据结构》基于哈夫曼算法的文件压缩程一.总体设计1.目标设计:*实现目标:利用哈夫曼算法编写一个可以对文件进行压缩和解压缩的程序,即可以将指定的文件用哈夫曼算法压缩为一个新的文件,也可以将一个压缩后的文件还原,并可以将压缩或还原后的文件保存到指定位置。

*功能描述:任何文件都可以看作是由字节组成的字节块,将字节看作基本编码单元,一个文件就可以看作是由字节组成的信息串。

对文件中各字节的出现频率进行统计,并以出现频率作为字节的权值,就可以用字节为叶结点构造哈夫曼树,进而构造出各字节的对应哈夫曼编码。

字节编码是一种8位定长编码,将各字节用哈夫曼编码进行重新编码,就有可能使得总的编码长度更短,从而达到压缩的效果。

哈夫曼编码是无损压缩当中最好的方法。

它使用预先二进制描述来替换每个符号,长度由特殊符号出现的频率决定。

常见的符号需要很少的位来表示,而不常见的符号需要很多位来表示。

哈夫曼算法对文件的压缩和解压缩的程序就是将存储源文件的二进制编码通过利用哈夫曼算法译为长度不等的哈夫曼编码,即得到哈夫曼树。

这棵树有两个目的:1.编码器使用这棵树来找到每个符号最优的表示方法,进而存储树实现文件的压缩。

2.解码器使用这棵树唯一的标识在压缩流中每个编码的开始和结束,其通过在读压缩数据位的时候自顶向底的遍历树,选择基于数据流中的每个独立位的分支,一旦一个到达叶子节点,解码器知道一个完整的编码已经读出来了,即通过对哈夫曼树的遍历实现解压过程。

2.框架设计:定义结构体类型变量struct head {}定义函数void compress() /*压缩文件*/{在函数compress内定义变量;读取被压缩文件;建立并打开目标文件;逐字节读入,并进行累加计数,得到各个字节在文件中的出现频率;利用哈夫曼算法构造出字节对应的哈夫曼树;将压缩后的数据写入目标文件,并保存;}定义函数uncompress() /*解压文件*/{在函数uncompress内定义变量;读取需解压文件;建立并打开目标文件;对哈夫曼树进行遍历实现解压;将解压后的数据写入目标文件,并保存;}定义主函数int main(){输入A,压缩文件,调用函数compress;输入B,解压文件,调用函数uncompress;}二.详细设计1、文件的字节频率统计字节共有256个,从0~255,可定义长度为256的频率数组来记录每个字节的出现频率。

数据传输压缩方法

数据传输压缩方法

数据传输压缩方法1.无损压缩:无损压缩是将数据压缩为更小的体积,但保持数据的完整性,即可以还原为原始数据。

无损压缩方法包括以下几种:-字典压缩算法:通过构建和使用字典来压缩数据。

一种著名的字典压缩算法是LZ77和LZ78算法。

-霍夫曼编码:通过根据数据中出现的频率来构建变长编码来压缩数据。

频率较高的数据使用较短的编码,而频率较低的数据使用较长的编码。

-预测编码:通过基于已经出现的数据来估计和编码将要出现的数据来压缩数据。

常见的预测编码算法有算术编码和定向插值方法。

2.有损压缩:有损压缩是将数据压缩为更小的体积,但会出现一定的数据损失,即无法完全还原为原始数据。

有损压缩方法可以提供更高的压缩比率,适用于一些对数据准确性要求较低的场景。

常见的有损压缩方法包括以下几种:-量化压缩:将数据分组并将其转换为离散的量级,减少数据的精度以便更高的压缩率。

例如,JPEG图像压缩算法使用离散余弦变换(DCT)将图像进行频域分析和量化。

-转换编码:使用转换矩阵来对数据进行变换和编码,以减少数据的冗余和相关性。

例如,MPEG视频压缩算法使用离散余弦变换(DCT)和运动补偿来进行编码和压缩。

-重采样:对信号进行重新采样,降低采样率以减少数据量。

例如,音频压缩算法中的MP3使用了重采样技术。

3.数据传输压缩方法:数据在传输过程中需要压缩以减少传输的时间和带宽使用。

以下是一些常见的数据传输压缩方法:-差分编码:利用数据的变化率来传输较小差异的增量数据,而不是将完整数据传输。

例如,压缩差分传输(CCITT)G3和G4算法用于传输扫描仪图像。

-数据成帧:将数据划分为较小的块(帧),然后对每个帧进行压缩和传输。

这种方法将数据传输划分为各个块的传输,每个块都可以使用不同的压缩算法。

例如,视频传输中的MPEG以帧为单位进行压缩和传输。

-打包压缩:将多个数据文件或多个数据块打包在一起进行压缩和传输。

这种方法可以提高压缩率并减少传输时间。

数据结构实验报告4文件压缩概要

数据结构实验报告4文件压缩概要

数据结构与程序设计实验实验报告哈尔滨工程大学实验报告四一、问题描述哈夫曼编码是一种常用的数据压缩技术,对数据文件进行哈夫曼编码可大大缩短文件的传输长度,提高信道利用率及传输效率。

要求采用哈夫曼编码原理,统计文本文件中字符出现的词频,以词频作为权值,对文件进行哈夫曼编码以达到压缩文件的目的,再用哈夫曼编码进行译码解压缩。

统计待压缩的文本文件中各字符的词频,以词频为权值建立哈夫曼树,并将该哈夫曼树保存到文件HufTree.dat 中。

根据哈夫曼树(保存在HufTree.dat 中)对每个字符进行哈夫曼编码,并将字符编码保存到HufCode.txt 文件中。

压缩:根据哈夫曼编码,将源文件进行编码得到压缩文件CodeFile.dat。

解压:将CodeFile.dat 文件利用哈夫曼树译码解压,恢复为源文件。

二、数据结构设计由于哈夫曼树中没有度为1的结点,则一棵树有n个叶子结点的哈夫曼树共有2n-1个结点,可以存储在一个大小为2n-1的一维数组中,而且对每个结点而言,即需知双亲结点的信息,又需知孩子结点的信息,由此可采用如下数据结构。

1.使用结构体数组统计词频,并存储:typedef struct Node{int weight; //叶子结点的权值char c; //叶子结点int num; //叶子结点的二进制码的长度}LeafNode[N];2.使用结构体数组存储哈夫曼树:typedef struct{unsigned int weight;//权值unsigned int parent, LChild, RChild;}HTNode,Huffman[M+1]; //huffman树3.使用字符指针数组存储哈夫曼编码表:typedef char *HuffmanCode[2*M]; //haffman编码表三、算法设计1.读取文件,获得字符串void read_file(char const *file_name, char *ch){FILE *in_file = Fopen(file_name, "r");unsigned int flag = fread(ch, sizeof(char), N, in_file);if(flag == 0){printf("%s读取失败\n", file_name);fflush(stdout);}printf("读入的字符串是: %s\n\n", ch);Fclose(in_file);int len = strlen(ch);。

Huffman的应用之文件压缩与解压缩汇总

Huffman的应用之文件压缩与解压缩汇总
解决了以上几个问题,我的程序已经可以压缩那256个字符并正确的还原了,那仫如果是大文件或者是汉字,图片以及音频视频呢?
1).因为有些特殊的字符编码,所以我们统计字符出现的次数的时候应该用的是unsigned char,刚开始我用的文件结束标志是EOF在ASII中它的编码是-1此时已经不可以用EOF来判断是否文件结束了,所以我用了feof这个函数来判断文件是否结束.
template<class T>
struct HuffmanTreeNode
{
T _weight;
HuffmanTreeNode<T> *_left;
HuffmanTreeNode<T> *_right;
HuffmanTreeNode<T> *_parent;
HuffmanTreeNode(const T& w=T())
Huffman的应用之文件压缩与解压缩
最近这段时间一直在学习树的这种数据结构,也接触到了Huffman树以及了解了什仫是Huffman编码,而我们常用的zip压缩也是利用的Huffman编码的特性,那仫是不是可以自己实现一个文件压缩呢?当然可以了.在文件压缩中我实现了Huffman树和建堆Heap的代码,zip压缩的介绍>
{}
HuffmanTree(const T* a,size_t size)
:_root(NULL)
{
_root=_CreatHuffmanTree(a,size);
}
//将未出现的字符过滤出来,不构造堆
HuffmanTree(const T* a,size_t size,const T& invalid)
下面是我举的一个简单的范例,模拟压缩和解压缩的过程,希望有读者有帮助

文件压缩和解压的原理

文件压缩和解压的原理

文件压缩和解压的原理1. 文件压缩的原理文件压缩是一种将文件大小变小的处理方法,常见的压缩文件格式有ZIP、RAR、7Z等。

文件压缩的原理就是通过对数据的重新排列、删除、替换、编码等操作,从而减少文件占用的空间。

压缩算法文件压缩的核心是压缩算法,常见的压缩算法有:1. LZW压缩算法:它是一种基于字典的压缩方法,可以在保证不丢失文件信息的前提下尽可能地压缩文件大小。

其基本原理是将文件中的字符序列与一个字典进行匹配,找到对应的编码序列,然后将该编码序列输出,最后更新字典。

2. Huffman编码:它是一种基于统计的编码算法,用于将不同符号映射到不同长度编码的方法。

其流程为:统计文件中各个字符出现的频率,根据频率构建哈夫曼树,从根节点开始遍历哈夫曼树得到字符的编码,将编码和对应的字符写入压缩文件。

3. 预测编码:这种算法通过模拟文件中数据的统计规律,预测下一个字符出现的可能性,将预测结果作为编码输出。

预测编码包括LZ77、LZ78和LZSS等压缩算法。

压缩文件格式压缩文件格式就是将压缩算法应用于具体的数据存储格式中,实现数据的压缩与解压。

常见的压缩文件格式有:1. ZIP:是一种流行的文件压缩格式,支持对多个文件和目录进行压缩,可以设置密码和压缩等级。

2. RAR:RAR是一种高效的压缩文件格式,可以将大文件分割成小文件,支持加密和卷宗技术。

3. 7Z:7Z是一种新型的高压缩率文件格式,采用了LZMA、LZMA2、PPMd和BCJ2等多种压缩算法,支持加密和自解压。

压缩的优点文件压缩有很多优点,比如:1. 节省存储空间:文件压缩可以将文件的大小变小,节省磁盘空间。

2. 方便传输:压缩后的文件体积变小,传输速度更快,也更容易传输。

3. 保护隐私:一些文件能够设置压缩密码来保护隐私。

2. 文件解压的原理文件解压就是将压缩后的文件还原为原始数据的过程,压缩文件格式支持压缩和解压功能。

文件解压的核心是解压算法,它是压缩算法的逆过程。

数据结构课程设计-文本压缩

数据结构课程设计-文本压缩

数据结构课程设计报告实验二:文本文件压缩一、设计要求1、问题描述:根据huffman编码以及二叉树的相关知识实现文本文件的压缩(即将输入的字符串转换为二进制编码)和解压(即将二进制编码转换为字符串)2、输入:文本文件(压缩文件)。

3、输出:压缩文件(文本文件)。

知识点:堆、霍夫曼树、二叉树遍历实际输入输出情况:源文件为文本文件,内容如下:输出的文件是以.zl0010为扩展名的二进制文件,将其用记事本以文本方式打开得到如下文件:解压过程如下:解压获得的文件doc.txt.zl0010.txt比较发现源文件与解压缩后文件内容相同。

一、数据结构与算法描述1.对输入文件的处理创建文件输入流,将源文本文件以二进制方式打开,建立保存每个Byte频率的数组count[256],并通过对文件的第一次遍历,完成对Byte频率的统计。

其中bytecount变量记录输入的字节数,关键代码如下:string filename;//文件名int count[256];//每个字符的频率for(int i=0;i<256;i++)count[i]=0;std::ifstream ifs;//输入流std::cout<<"请输入需要压缩的文件路径"<<std::endl;std::cin>>filename;ifs.open(filename,std::ifstream::binary);if(!ifs){std::cout<<"文件打开错误"<<std::endl;system("pause");exit(0);}char buf;int bytecount=0;//计算总共输入了多少字节std::cout<<"正在计算频率……"<<std::endl;while(!ifs.eof()){ifs.read((char*)&buf,1);/*buf+=128;count[buf]++;*/if(ifs.eof())break;count[(int)buf+128]++;bytecount++;/*std::cout<<(int)buf<<std::endl;*/}2.哈夫曼树的建立及编码过程以第一步中统计的Byte出现频率为每个树节点的权值,进行哈夫曼树的构建,并通过构建的哈夫曼树,获取std::string类型的哈夫曼编码。

数据结构实验报告利用Huffman编码对文件进行压缩解压

数据结构实验报告利用Huffman编码对文件进行压缩解压

《数据结构》实验报告利用Huffman编码对文件进行压缩解压学生:XXX学号:XXXXXXXX联系:XXXXXX@(一)基本信息1.实验题目利用Huffman编码对文件进行压缩解压2.完成人(姓名、学号)姓名:XXX 学号:XXXXXXXX3.报告日期2007年12月12日星期二(二)实习内容简要描述1.实习目标学会对树的基本操作学会对文件进行操作利用Huffman编码对文件压缩解压2.实习要求实现最小堆模板类利用最小堆构建Huffman树实现Huffman编码和解码根据用户从键盘输入的报文文本,输出各字符的Huffman编码以及报文的编码根据用户从键盘输入一串报文文本,输出各字符的Huffman编码输出报文的Huffman编码及长度根据输入的Huffman编码,解码输出利用Huffman编码和解码对二进制文件的压缩和解压(三)报告主要内容1.设计思路开发环境:Microsoft Visual C++ 2005设计思路:1.设计Pack类储存字符的权值2.设计MinHeap模板类构建最小堆3.设计ExtBinTree模板类为带权二叉树4.设计Compress模板类以实现文件的压缩解压2.主要数据结构1.MinHeap.h: 头文件,包含MinHeap模板类的类界面以及定义;2.HuffmanTree.h:头文件,包含ExtBinTree模板类以及Compress模板类的类的的类界面以及定义3.main.cpp:调用上述头文件实现相关操作3.主要代码结构主要代码结构为见附件中各文件的代码注释4.主要代码段分析主要代码段分析,见附件中的代码注释(四)实习结果1.基本数据源程序代码行数:约800行完成该实习投入的时间:二十四小时(不包括写实验报告的时间)与其他同学讨论交流情况:感谢刘畅同学对程序的测试2.测试数据设计1.对屏幕输入字符进行Huffman编码2.根据Huffman树非唯一性,虽然和课件上有些许不同,但是还是正确的3.输入字符串:CASTCASTSATATATASA4.输出编码:A:0 C:110 S:111 T:105.输入霍夫曼编码:01110101101106.输出译码:ASATCC7.8.对”实验05.PPT”的压缩操作9.使用0秒(不足一秒按0秒计算),压缩率为56.1755%10.对”实验05.ppt.hfm”(即刚才生成的压缩文件)的解压操作11.使用0秒(不足一秒按0秒计算),解压后文件无异常12.对一个18M的EXE安装包前后进行压缩和解压操作,分别用时10秒和9秒3.测试结果分析A)程序运行的系统资源配置操作系统:Microsoft Windows XP Professional SP2CPU: AMD Athlon 3600+ 2.0GRAM: 1024M DDRII开发环境:Microsoft Visual C++ 2005B)对TXT文档进行压缩和解压后,通过WinMerge检验和原文件无差异C)对MP3和EXE文件压缩和解压后仍能正常使用D)对于中文名字和带有空格的路径均能正确无误识别E)文件名只能小于16个字符(包括后缀名),否则解压会出错(只预留了16个字节用于储存文件名)F)相对于不用文件块读写的程序,效率提高了三倍以上G)具有动态进度条,可以显示当前压缩和解压的进度百分比(当然消耗了一些系统资源)H)出错处理不够充分,特别是cin部分,如果误输入可能会造成死循环(五)实习体会1.实习过程中遇到问题及解决过程A)一开始时候的程序运行很慢,,压缩一个4M左右的文件需要七八秒,后来改用文件块缓存字节来读写后,压缩一个4M的文件只需要两秒左右的时间.本来是只想写一个进度条而已的,后来发现如果只读一个字节就判断一次进度条的话会很消耗系统资源,后来干脆麻烦点用文件块来缓存.不过至于一次缓存多少字节才能达到最好的效果还未知,现在设置的是一次缓存40KB 的数据B)本来一个一个字节读的时候对最后一个字节的操作基本没费什么劲,但是在文件块读写的时候就不是那么清晰明了了,后来经过仔细Debug,才找到错误的所在.许多问题都是这样C)对于中文名和带空格路径,用C++的fstream就不支持,但是C中的FILE*就支持,不知道为什么.还有C++中的fstream的成员函数read返回值很奇怪,不知道如何获取成功读入的项数.改用C中的FILE*文件指针后就解决掉了D)由于这次实验的各个步骤是一环套一环的,在哪里出错很难找得出来,所以这次实验调试消耗的时间特别多.最郁闷的一次错误是发现在取得字符C的第N位函数中,居然把0x40写成了0x30.有时候文件解压出来不对,但是又不清楚是压缩时候错了,还是解压时候错了,然后就要两个函数都要检查一遍.2. 实习体会和收获这次实验最大的特点在于难找错,很锻炼自己的Debug能力(六)自评成绩分数:90 //功能做得较齐全,程序的效率也不错(七)参考文献MSDN还有某网站上树的遍历算法(八)源程序见同一文件夹内.。

大数据的结构

大数据的结构

大数据的结构随着信息技术的迅速发展和不断进步,大数据已经成为当今社会中不可或缺的一部分。

与传统数据不同,大数据具有三个方面的特点:数据量巨大、数据来源多样、数据处理复杂。

为了更好地应对这些挑战,大数据需要一个合适的结构来进行组织和管理。

本文将讨论大数据的结构以及如何优化其效率。

一、大数据的结构概述大数据的结构可以简单地理解为数据的组织方式和存储方式。

常见的大数据结构包括:关系型数据库结构、非关系型数据库结构、数据仓库结构和分布式文件系统结构。

这些结构都有各自的特点和适用场景。

1. 关系型数据库结构关系型数据库结构是目前应用最广泛的一种结构。

它采用二维表的方式将数据进行存储和组织,通过定义表之间的关系来实现数据的查询和管理。

关系型数据库结构适用于逻辑结构清晰、数据之间有明确关联的场景。

2. 非关系型数据库结构非关系型数据库结构也被称为NoSQL数据库结构,它摒弃了二维表的形式,采用更加灵活的方式来存储和组织数据。

非关系型数据库结构适用于数据结构较为复杂、数据量巨大、读写频率较高的场景。

3. 数据仓库结构数据仓库结构是一种专门用于存储和管理大量历史数据的结构。

它采用星型或雪花型的数据模型,通过ETL(抽取、转换和加载)过程将数据从不同的源导入到数据仓库中。

数据仓库结构适用于数据分析和决策支持等应用场景。

4. 分布式文件系统结构分布式文件系统结构通过将大数据划分为多个小文件,并将这些文件存储在多个节点上来实现数据的存储和管理。

分布式文件系统结构适用于数据分散、持续不断地增长以及需要高可靠性和高可扩展性的场景。

二、优化大数据结构的方法为了提高大数据的效率和性能,有几种方法可以用来优化大数据的结构。

1. 数据分区数据分区是将数据划分为若干部分,并将这些部分分散到不同的存储介质上。

通过数据分区,可以提高数据的读写效率,减少数据冗余和冗杂性。

2. 数据冗余数据冗余是指将数据备份到多个位置,以提高数据的可靠性和可用性。

常见的压缩格式

常见的压缩格式

压缩-压缩和输入分片 压缩将由MapReduce处理的数据时,压缩格式是否支持切片 (splitting)是非常重要的。
压缩-在MapReduce中使用压缩 如果输入文件是压缩的,根据文件扩展名推断出相应的codec后, MapReduce会在读取时文件时自动解压缩文件。
对MapReduce作业的输出进行压缩,应在祖业配置过程中,将 press属性设置为true和 pression.codec属性设置为打算使用的压缩 codec的类名。
序列化-Writable接口
writable接口定义了两个方法: 1. 将其状态写到DataOutput二进制流 2.从DataInput二进制流读取其状态
序列化-Writable接口
用途: 使用Inwritable封装一个Java int
在序列化对象捕捉字节流
序列化-Writable接口
用途: 反序列化(从一个字节数组中读取一个Writable对象):
Hadoop I/O
By ShiChaojie
index
1
2 3 4
数据完整性 压缩
序列化 基于文件的数据结构
Introduction
所谓I/O,通俗的讲就是:利用接口等处理不同输入输出信息。 Hadoop自带一套原子操作用于数据I/O。其中一些技术比较常用, 如数据完整性保持与压缩。 另一些则是基于Hadoop工具或者API,它们所形成的构建模块可用 于开发分布式系统,比如序列化操作和在盘(on-disk)数据结构。 对于多达几个TB的数据集,这些方法特别值得关注。
压缩-CompressionCodec 该程序压缩从标准输入读取的数据,然后将其写到标准输出。
压缩-CompressionCodecFactory 在读取一个压缩文件时,通常可以通过文件拓展名推断需要使用哪 个codec。 若文件以.gz结尾,则可以用GzipCodec来读取。 通过使用getCodeC()方法, CompressionCodecFactory提供了一 种方法将文件名映射到一个CompressionCodec,改方法读取文件 的Path对象作为参数。

哈夫曼文件压缩实验报告

哈夫曼文件压缩实验报告

哈夫曼文件压缩实验报告数据结构实验报告三哈夫曼文件压缩实验题目:哈夫曼文件压缩实验目标:输入一个有10k单词得英文文档。

输出压缩后得二进制文件,并计算压缩比。

数据结构:栈与哈夫曼树。

1.定义栈()typedefstruct{;mele*rahcﻩ;eziskcatstniﻩinttop;}STACK;2.定义哈夫曼树()typedefstruct{intweight;;thgir,tfeltniﻩintparent;}HTNode;需要得操作有:1、初始化栈(Initstack)voidInitstack(STACK*s){;)0001*)tni(foezis(collam)*rahc(=mele-sﻩs-stacksize =1000;;1-=pot>-sﻩ}2、压栈(push)voidpush(STACK*s,inte){;e=]pot-s++[mele>-sﻩ}3、弹栈(pop)voidpop(STACK*s,int*e){)1-=!pot-s(fiﻩ*;]--pot-s[mele>-s=eﻩ}4、构造哈夫曼树(Inithuffman)voidInithuffman(intwset[n],intk,HuffTreeHT[]){//构造哈夫曼树inti,m;ints1,s2;m=k*2-1;for(i=0;ii++){//初始化HT数组HT[i]=(HuffTree)malloc(sizeof(HTNode));;)0:]i[tesw?ki(=thgiew-]i[THﻩ;1-=tnerap-]i[THﻩﻩ;1-=thgir-]i[TH=tfel>-]i[THﻩ}并合次1-n成完,环循主//{)++i;mk=i(rofﻩﻩap择选中]1-i、、、1[TH在//;)2s,1s,i,k,TH(tcelesﻩrent为0且weight为最小得两个结点,其下标分别为s1与s2ﻩ;1s=tfel-]i[THﻩﻩ;2s=thgir-]i[THﻩﻩHT[i]-weight=HT[s1]-weight+HT[s2]-weight;;i=tnerap>-]2s[TH=tnerap-]1s[THﻩ}}其中用到另一个基本操作:找到哈夫曼树中最小与次小得结点(select)5、找到哈夫曼树中最小与次小得结点(select)voidselect(HuffTreeHT[255],inta,inti,int*p,int*q){intj=0,k=0,*HT1,temp;HT1=(int*)malloc(sizeof(int)*(i-1));//存放权值{)++j;i0=j(rofﻩﻩ{)1-==tnerap-]j[TH(fiﻩﻩHT1[k]=HT[j]-weight;//把没有parent得结点得权值放在HT1中ﻩk++;}ﻩ//,thgir-]j[TH,tfel>-]j[TH,tnerap-]j[TH,n\d4%d4%d4%d4%d4%(ftnirpﻩHT[j]-weight,HT1[k-1]);}j=0;点结得小二第与小最值权到找//{)2j(elihwﻩﻩfor(k=j;k(i-(i-a)*2);k++){ﻩ{)]k[1TH]j[1TH(fiﻩtemp=HT1[k];ﻩﻩ;]j[1TH=]k[1THﻩﻩHT1[j]=te0=kﻩ{);i0=j(rofﻩif(HT[j]-parent==-1)ﻩ中};mp;ﻩ}ﻩ}ﻩ;++jﻩp*到赋值权得小最将//{)1k&]0[1TH==thgiew-]j[TH}ﻩﻩj++;}ﻩ{);i<j;0=j(rofﻩ(fiﻩﻩ*;j=pﻩﻩﻩ;++kﻩﻩﻩ)1-==tnerap>-]j[TH(fiﻩ)p*=!j(fiﻩﻩif(HT[j]->weight==HT 1[1]k2){//将第二小得权值赋到*q中*ﻩﻩﻩ;j=qﻩﻩk++;ﻩ}j++;//,thg ir-]i[TH,tfel-]i[TH,tnerap-]i[TH,n\d4%d4%d4%d4%"(ftnirpﻩHT[i]-weight);}ﻩ}6、根据哈夫曼树得到各字符对应得哈夫曼编码(Huffman)voidHuffman(HuffTreeHT[2*n-1],intk,charstr[][20]){inti,j,e,t1=0,t2=0;char c;;tsKCATSﻩ{)++i;k<i;0=i(rofﻩﻩ点结子叶个一找//{)1-==tfe;2-l>-]i[TH1-==thgir-]i[TH(fiﻩﻩ;)ts(kcatstinIﻩﻩ==tfel-]i[TH=thgir-]i[THﻩj=i;//记录其下标ﻩ{)1-=!tnerap>-]j[TH(elihwﻩif(HT[HT[j]-parent]-right==j)//找到一个叶子结点,如果她就是其parent结点得右结点,就将此边记为1;)"1",ts&(hsupﻩﻩﻩesleﻩﻩﻩ0为记边左在//;)"0",ts(hsupﻩﻩﻩﻩ点结根达到到直作操环循//;tnerap-]j[TH=jﻩ}ﻩﻩﻩ;i=cﻩﻩ符字此印打//;)c,c%t\(ftnirpﻩﻩ1-=!pot、ts;(r{);ofﻩﻩﻩﻩ;)e&,ts(popﻩﻩ码编制进二其印打//;)e,c%(ftnirpﻩﻩstr[tﻩﻩﻩ;)'n\1][t2]=e;//将二进制编码存放在str中ﻩt2++;ﻩ}"=]2t[]1t[rtsﻩﻩ;0=2tﻩﻩ;++1tﻩ}ﻩﻩ\"(rahctupﻩﻩ;"}}算法设计:1、从文件中逐个读取字符,记录其出现次数以及文件总字符数,由此确定其频率高低。

大数据中常见的文件存储格式以及hadoop中支持的压缩算法

大数据中常见的文件存储格式以及hadoop中支持的压缩算法

大数据中常见的文件存储格式以及hadoop中支持的压缩算法摘要:1.大数据中的文件存储格式a.文本格式b.二进制格式c.列式存储格式d.对象存储格式2.Hadoop 中的文件存储格式a.HDFSb.Hivec.Impala3.Hadoop 支持的压缩算法a.Gzipb.Snappyc.LZOd.Parquet正文:随着大数据技术的发展,数据存储和处理能力不断提高,文件存储格式和压缩算法的选择对于数据处理效率至关重要。

本文将介绍大数据中常见的文件存储格式以及Hadoop 中支持的压缩算法。

一、大数据中的文件存储格式1.文本格式:文本格式是一种常见的数据存储格式,适用于存储结构化或半结构化的数据。

常见的文本格式包括CSV(逗号分隔值)和JSON (JavaScript 对象表示法)。

文本格式具有易于阅读和编写的优势,但不适用于存储大型数据集。

2.二进制格式:二进制格式适用于存储结构化数据,如数据库中的数据。

它可以有效地存储数据,并快速进行数据检索和处理。

常见的二进制格式包括Protobuf 和Avro。

二进制格式具有存储效率高、数据处理速度快的优势,但阅读和编写较为困难。

3.列式存储格式:列式存储格式是一种适用于大数据处理的存储格式。

它将数据按照列进行存储,以提高数据压缩率和查询速度。

常见的列式存储格式包括Parquet 和ORC。

列式存储格式具有存储空间小、查询速度快的优势,但写入数据时需要对数据进行列式处理。

4.对象存储格式:对象存储格式是一种以对象为单位存储数据的格式。

每个对象都包含一个唯一的键和数据内容。

常见的对象存储格式包括JSON 和XML。

对象存储格式具有数据结构灵活、易于扩展的优势,但不适用于所有场景。

二、Hadoop 中的文件存储格式1.HDFS:HDFS(Hadoop 分布式文件系统)是Hadoop 中的基础文件存储系统。

它适用于存储大规模数据,并提供高可靠性和容错能力。

HDFS 支持多种文件存储格式,如文本格式、二进制格式和列式存储格式。

数据结构中的压缩与解压缩算法

数据结构中的压缩与解压缩算法

数据结构中的压缩与解压缩算法在数据结构中,压缩与解压缩算法扮演着重要的角色。

它们可以显著减少数据存储和传输所需的空间和时间。

压缩算法使用各种技术来减少数据的大小,而解压缩算法则将压缩的数据还原到其原始状态。

本文将介绍几种常用的压缩与解压缩算法,并讨论它们的原理和应用。

一、哈夫曼编码哈夫曼编码是一种基于变长编码的压缩算法。

它通过根据输入数据中字符的频率来构建一棵哈夫曼树,并生成一个独特的编码表。

在哈夫曼编码中,频率较高的字符用较短的编码表示,而频率较低的字符用较长的编码表示。

这种编码方式可以大大减少数据的大小,并且可以在解压缩时快速还原原始数据。

二、LZW压缩LZW(Lempel-Ziv-Welch)压缩算法是一种基于字典的压缩算法。

它通过在压缩和解压缩过程中动态构建和更新字典,将输入数据中的字符串替换为对应的索引。

LZW压缩算法能够在保持数据质量的同时实现很高的压缩比。

它被广泛应用于图像、音频和视频等多媒体数据的压缩。

三、Run-Length编码Run-Length编码是一种简单但有效的压缩算法。

它通过将连续重复的字符或数据序列替换为一个标记和一个计数值来实现压缩。

例如,连续出现的字符 "AAAABBBCCD" 可以被编码为 "4A3B2C1D"。

Run-Length编码在处理包含大量连续重复数据的情况下非常有效,但对于非重复数据的压缩效果有限。

四、Burrows-Wheeler变换Burrows-Wheeler变换是一种用于数据压缩的重排和重新排列技术。

它通过对输入数据进行循环右移和排序,生成一个新的字符串。

然后,通过记录原始字符串的最后一个字符在排序后的字符串中的位置,以及排序后的字符串中的每个字符前一个字符的索引,可以实现数据的压缩。

解压缩时,通过逆向操作将压缩后的数据还原为原始数据。

以上介绍了几种常用的压缩与解压缩算法,它们在数据结构中起着重要的作用。

数据链路层技术中的数据压缩与解压缩方法

数据链路层技术中的数据压缩与解压缩方法

数据链路层技术中的数据压缩与解压缩方法引言:在当今信息爆炸的时代,人们对数据的需求越来越大。

然而,网络传输带宽有限,因此数据压缩和解压缩成为了数据链路层技术中的重要环节。

本文将探讨数据链路层技术中的数据压缩与解压缩方法。

一、数据压缩的意义及方法数据压缩的意义数据压缩是指通过某种算法将数据的存储或传输空间减小,从而达到节省资源的目的。

在数据传输过程中,数据的压缩可以降低网络带宽的占用率,提高数据传输的效率。

数据压缩的方法常见的数据压缩方法包括有损压缩和无损压缩。

有损压缩是指通过去除数据中的冗余信息,以牺牲一定的数据精度为代价,来压缩数据。

而无损压缩则是保持数据的完整性,通过利用数据中的冗余与重复信息来实现压缩。

二、数据压缩算法静态字典压缩算法静态字典压缩算法是通过构建一个固定的词典来实现压缩。

在这种算法中,发送方和接收方之间约定好一组固定的词典,并且对传输的数据进行编码和解码。

这样可以极大地减小传输的数据量,提高传输效率。

动态字典压缩算法与静态字典压缩算法不同的是,动态字典压缩算法可以根据数据本身的特点动态地生成词典。

在传输数据的过程中,发送方会不断更新词典,并将词典的变化信息发送给接收方,从而实现数据的压缩和解压缩。

三、数据解压缩方法解压缩算法的选择在数据解压缩过程中,我们需要选择适合的解压缩算法。

根据数据的压缩方式,我们可以选择对应的解压缩算法,如对应有损压缩的解压缩算法、对应无损压缩的解压缩算法等。

解压缩算法的性能评估解压缩算法的性能评估可以从压缩比、解压缩速度以及解压缩质量等方面考虑。

我们需要根据实际需求,选择合适的解压缩算法来平衡压缩比和解压缩速度。

四、数据压缩与解压缩在数据链路层中的应用数据传输优化在数据链路层中,数据压缩和解压缩技术可以提高数据传输的效率,减小网络带宽的占用率,从而降低数据传输的时延。

数据存储优化数据链路层的数据压缩和解压缩技术可以在存储设备上节省存储空间,提高存储效率。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构实验报告实验名称:文件压缩实验类型:综合性试验班级:20112111学号:2011211107姓名:冯若航实验日期:2003.6.19 下午4:001.问题描述文件压缩①基本要求哈夫曼编码是一种常用的数据压缩技术,对数据文件进行哈夫曼编码可大大缩短文件的传输长度,提高信道利用率及传输效率。

要求采用哈夫曼编码原理,统计文本文件中字符出现的词频,以词频作为权值,对文件进行哈夫曼编码以达到压缩文件的目的,再用哈夫曼编码进行译码解压缩。

●统计待压缩的文本文件中各字符的词频,以词频为权值建立哈夫曼树,并将该哈夫曼树保存到文件HufTree.dat中。

●根据哈夫曼树(保存在HufTree.dat中)对每个字符进行哈夫曼编码,并将字符编码保存到HufCode.txt文件中。

●压缩:根据哈夫曼编码,将源文件进行编码得到压缩文件CodeFile.dat。

●解压:将CodeFile.dat文件利用哈夫曼树译码解压,恢复为源文件。

2.数据结构设计此类问题,应设计文件的数据结构。

* 4 压缩头标记* 1 文件名长度* ns 文件名* 4 源文件长度* 1020 huffman树* 1021~EOF 文件内容赫夫曼树节点的数据结构typedef struct node{long w; //权short p,l,r; //父亲,左孩子,右孩子}HTNODE,*HTNP; //霍夫曼树的结点赫夫曼编码数组元素的数据结构设计typedef struct huffman_code{BYTE len; //长度BYTE *codestr; //字符串}HFCODE; //霍夫曼编码数组元素3.算法设计源代码#define_CRT_SECURE_NO_DEPRECATE#include<stdio.h>#include<string.h>#include<stdlib.h>typedef unsigned int UINT;typedef unsigned char BYTE;typedef struct node{long w; //权short p,l,r; //父亲,左孩子,右孩子}HTNODE,*HTNP; //霍夫曼树的结点typedef struct huffman_code{BYTE len; //长度BYTE *codestr; //字符串}HFCODE; //霍夫曼编码数组元素#define OK 1#define ERROR -1#define UNUSE -1 //未链接节点标志#define CHAR_BITS 8 //一个字符中的位数#define INT_BITS 32 //一个整型中的位数#define HUFCODE_SIZE 256 //霍夫曼编码个数#define BUFFERSIZE 256 //缓冲区大小大小#define UINTSIZE sizeof(UINT)#define BYTESIZE sizeof(BYTE)#define TAG_ZIGHEAD 0xFFFFFFFF //压缩文件头标#define MAX_FILENAME512//函数声明//压缩模块int Compress(char *SourceFilename,char *DestinationFilename);//压缩调用int Initializing(char *SourceFilename,FILE **inp,char *DestinationFilename,FILE **outp); //初始化文件工作环境long AnalysisFiles(FILE *in,long frequency[]);//计算每个不同字节的频率以及所有的字节数int CreateHuffmanTree(long w[],int n,HTNODE ht[]);//生成霍夫曼树int HuffmanTreeCoding(HTNP htp,int n,HFCODE hc[]);//霍夫曼编码int Search(HTNP ht,int n);//查找当前最小权值的霍夫曼树节点并置为占用BYTE Char2Bit(const BYTE chars[CHAR_BITS]);//将一个字符数组转换成二进制数字int Search(HTNP ht,int n);//查找当前最小权值的霍夫曼树节点并置为占用int WriteZipFiles(FILE *in,FILE *out,HTNP ht,HFCODE hc[],char* SourceFilename,long source_filesize);//写压缩文件//解压缩模块int DeCompress(char *SourceFilename,char *DestinationFilename);//解压缩调用int Initializing_Dezip(char *SourceFilename,FILE **inp,char*DestinationFilename,FILE **outp); //为处理解压缩流程初始化文件void ReadHuffmanTree(FILE* in,short mini_ht[][2]);//从待解压缩文件中读取huffman树int WriteDeZipFiles(FILE *in,FILE* out,short mini_ht[][2],long bits_pos,longDst_Filesize); //写解压缩文件void ErrorReport(int error_code);//报错//函数定义//函数实现//压缩int Compress(char *SourceFilename,char *DestinationFilename){FILE *in,*out; //输入输出流int i; //计数变量float Compress_rate; //存放压缩率HFCODE hc[HUFCODE_SIZE]; //存放256个字符的huffman编码HTNODE ht[HUFCODE_SIZE*2-1]; //256个字符的huffman树需要2*256-1=511个节点。

long frequency[HUFCODE_SIZE],source_filesize,Dst_Filesize=0;//字符频率数组,源文件,目标文件。

//处理待压缩与压缩文件文件Initializing(SourceFilename,&in,DestinationFilename,&out);puts("Loading Files...");//处理各个字符的频率,并输出原始文件长度source_filesize=AnalysisFiles(in,frequency);puts("Loading Complete!Now Analysising...");printf("Original size:%ld Byte \n",source_filesize);//创建Huffman树CreateHuffmanTree(frequency,HUFCODE_SIZE,ht);//Huffman编码puts("Huffman Tree Initialized Successfully,HuffmanCoding Processing...");HuffmanTreeCoding(ht,HUFCODE_SIZE,hc);//计算目标文件长度for(i=0;i<HUFCODE_SIZE;i++){//计算位的个数,计算每个字符的频数与其编码长度乘积之和Dst_Filesize+=frequency[i]*hc[i].len;}//将文件主体部分的位个数转换为字节个数;Dst_Filesize=Dst_Filesize%8==0?Dst_Filesize/8:Dst_Filesize/8+1;for(i=0;i<HUFCODE_SIZE-1;i++){//huffmantree长度Dst_Filesize+=2*sizeof(short);}Dst_Filesize+=strlen(SourceFilename)+1; //源文件名占用空间Dst_Filesize+=sizeof(long); //源文件名长度信息占用空间Dst_Filesize+=UINTSIZE; //文件头长度Compress_rate=(float)Dst_Filesize/source_filesize; //压缩率puts("Coding Successfully.Now producing zip files...");printf("Compressed File Size:%ld Byte,radiation: %%%.2lf\n",Dst_Filesize,Compress_rate*100);//生成压缩文件WriteZipFiles(in,out,ht,hc,SourceFilename,source_filesize);puts("Compress Complete!");//擦屁股fclose(in);fclose(out);//关闭文件for(i=0;i<HUFCODE_SIZE;i++){free(hc[i].codestr);}return OK;}int Initializing(char *SourceFilename,FILE **inp,char *DestinationFilename,FILE **outp) {if(strcmp(SourceFilename,DestinationFilename)==0){//重名判断return ERROR;}printf("Source File:%s,Destination File:%s\n",SourceFilename,DestinationFilename);if((*outp=fopen(DestinationFilename,"wb"))==NULL){//文件打开错误return ERROR;}if((*inp=fopen(SourceFilename,"rb"))==NULL){//文件打开错误return ERROR;}return OK;}long AnalysisFiles(FILE *in,long frequency[]){int i,read_len;BYTE buf[BUFFERSIZE]; //缓冲区long filesize; //文件总长for(i=0;i<HUFCODE_SIZE;i++){frequency[i]=0; //初始化所有字符频率为0}fseek(in,0L,SEEK_SET); //将文件定位符指向文件开头read_len=BUFFERSIZE; //设置读入长度=缓冲区长度while(read_len==BUFFERSIZE) //每当读取字符长度达到缓冲区长度时{read_len=fread(buf,1,BUFFERSIZE,in);for(i=0;i<read_len;i++){frequency[*(buf+i)]++; //统计字频}}for(i=0,filesize=0;i<HUFCODE_SIZE;i++){filesize+=frequency[i]; //计算文件长度,计算方法是把所有字符的频数相加}return filesize;}int Search(HTNP ht,int n){int i,x;for(x=0;x<n;x++){if(ht[x].p==UNUSE) break; //找到第一个没有使用的叶子节点,跳出}for(i=x;i<n;i++){if(ht[i].p==UNUSE&&ht[i].w<ht[x].w){x=i; //找权值最小的叶子节点}}ht[x].p=-2; //将叶子节点占用return x;}int CreateHuffmanTree(long w[],int n,HTNODE ht[]){int m,i,s1,s2;if (n<1) return ERROR;m=2*n-1; //霍夫曼树节点总数=叶子数*2-1if (ht==NULL) return ERROR;for(i=0;i<n;i++){ht[i].w=w[i],ht[i].p=ht[i].l=ht[i].r=UNUSE; //初始化叶子节点}for(;i<m;i++){ht[i].w=ht[i].p=ht[i].l=ht[i].r=UNUSE; //初始化分支节点}for(i=n;i<m;i++)//建立huffman树{ //循环至m-n个分支节点全部被使用完为止s1=Search(ht,i);s2=Search(ht,i); //找到权值最小的两个节点,这里通过两次调用寻找最小权值的函数search解决问题ht[s1].p=ht[s2].p=i; //设置父节点ht[i].l=s1,ht[i].r=s2; //设置孩子ht[i].w=ht[s1].w+ht[s2].w; //设置权为两个孩子权之和}return OK;}int HuffmanTreeCoding(HTNP htp,int n,HFCODE hc[]){int i,j,p,codelen; //codelen:临时字符数组长度变量BYTE *code=(BYTE*)malloc(n*BYTESIZE); //临时字符数组,为每一个字符的编码申请一个字节的空间for(i=0;i<n;i++){//从当前节点到根节点逆向求huffman编码,遍历所有叶子节点。

相关文档
最新文档