作为一个不能称得上是菜鸟的菜鸟,最近刚刚学习了树以及哈夫曼树(最优二叉树)的知识。正准备利用哈夫曼原理做一个压缩软件。现在现将我的思路记录下来,大家如果有好的意见可以评论给我,大家一起学习!!!
首先先解释一下为什么可以用利用哈夫曼树做压缩软件。我们都知道哈夫曼树有一个特点:加全路径最小。。就是利用了这一点。
下面我们开始操作的步骤:
首先我们要造一颗哈树,目的是为了给文件的字节重新编码,我们可以把一个文件里的每个字节放在哈树的叶节点上,叶节点的权值代表该种字节的个数。那么,距离树根越近的字节的个数(权值)越大,距离树根越远的字节的个数(权值)越小。
其次我们要规定编码规则:
这里可以规定树枝向左为1,向右为0(当然也可以反过来)。这样每个字节就都有了一个编码(自己规定的编码),而源文件里各个字节的编码都是8位的,经过计算,重新编码后的字节总大小(文件总大小)必定小于原文件大小。
然后我们就要开始压缩了:
编码后,再把所有的字节写入一个新的文件就实现压缩了。。。。这里要注意压缩写入文件正文之前,我们先要写入文件的码表(利用哈树得到),不然如何解压呢?
在文件的写入中我们有时会遇到这么一个问题:这里我们以字节写入,当写到最后一个字节的时候发现最后的bit数不够组成一个字节。假设最后只剩2位。这里我们可以自己在后面补上6个0,当然6个1,0都可以不过自己要记住,否则在解压的时候会乱码的。。。。
最后的步骤是解压缩:
解压缩和压缩是一个相逆的过程,压缩时一个写文件的过程,解压缩是一个读文件的过程。要注意的是以什么书序写入(压缩),就以什么顺序读,我们这里是按一个字节一个字节进行读写的因此也就不存在顺序的问题了。当读到最后一个字节后,我们注意把他还原成没有补0或1的情况。。。。
上述只是个人拙见,随着学习进度的增长,会继续补充。
分享到:
相关推荐
哈夫曼压缩与解压缩源码.zip哈夫曼压缩与解压缩源码.zip哈夫曼压缩与解压缩源码.zip哈夫曼压缩与解压缩源码.zip哈夫曼压缩与解压缩源码.zip哈夫曼压缩与解压缩源码.zip哈夫曼压缩与解压缩源码.zip哈夫曼压缩与解压缩...
vc++哈夫曼压缩算法 vc++哈夫曼压缩算法
哈夫曼算法实现图片的压缩,图片有前后对比。
哈夫曼实现文件的压缩与解压缩,代码关键部分有注释。
C语言实现的huffman压缩解压缩算法
每次选出权值最小且没有双亲的两个节点建立新的哈弗曼树。 无栈非递归遍历Huffman树,求Huffman编码。...要注意的是当文件较小时,不宜使用哈夫曼来进行压缩,此时文件头占比过大,会使压缩结果很差。
哈夫曼压缩与解压缩程序(JAVA)
通过自定义算法创建哈夫曼树和编码,对文件进行二进制操作实现压缩和解压。
哈夫曼压缩和解压和解压,数据结构课程设计,c++源码。
压缩解压缩 源码 VC MFC实现 可供学习研究
java实现的哈夫曼压缩算法,有swing界面。
利用哈夫曼算法进行文件的压缩和解压缩。 利用命令行对指定的文件进行压缩和解压缩。 能对一般的文本文件有较好的压缩能力,对其它格式文件可以进行压缩但不一定能有压缩效果。对于用此程序压缩的文件可以用此程序...
c++ 哈夫曼压缩源代码. 多种文件格式 亲测可用
这里采用哈夫曼编码方式来对每个字符重新编码,因为哈夫曼树具有最小带权路径长度的性质,能够生成用于压缩的二进制前缀码。程序使用的 “静态统计模型”,也就是说在编码前统计要编码的信息中所有字符的出现频率,...
代码为将普通数据使用哈夫曼编码的算法压缩。该压缩属于无损压缩
利用哈夫曼编码对数据进行无损压缩,实现Huffman压缩的编码器和译码器。 1.首先读入待压缩源文件。 2.然后建立并分析字母表,对每种字符的出现频度进行统计,以频度作为建立Huffman树的权值。 3. 频度表建好后,就...
哈夫曼压缩与解压算法(可以直接运行),压缩成二进制文件,而且生成了txt文件可以查看哈夫曼编码。C++代码
图像编码哈夫曼压缩编码
实验目的:理解哈弗曼信源编码算法,并能应用于文件压缩中。 实验内容:写出程序,利用哈弗曼编码实现对文件的压缩,并能解压文件。 实验步骤: 1、压缩 (1) 统计原始文件中各字节出现的概率(次数); (2) 采用...
使用哈夫曼编码实现对文本文件的压缩和解压缩