数据结构文件压缩
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语言中常用的数据压缩与解压缩方法。
一、哈夫曼编码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中常用的数据压缩技术和相关的库。
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以帧为单位进行压缩和传输。
-打包压缩:将多个数据文件或多个数据块打包在一起进行压缩和传输。
这种方法可以提高压缩率并减少传输时间。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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编码,遍历所有叶子节点。