前两天发布那个rsync算法后,想看看数据压缩的算法,知道一个经典的压缩算法Huffman算法。相信大家应该听说过 David Huffman 和他的压缩算法—— Huffman Code,一种通过字符出现频率,Priority Queue,和二叉树来进行的一种压缩算法,这种二叉树又叫Huffman二叉树 —— 一种带权重的树。从学校毕业很长时间的我忘了这个算法,但是网上查了一下,中文社区内好像没有把这个算法说得很清楚的文章,尤其是树的构造,而正好看到一篇国外的文章《A Simple Example of Huffman Code on a String》,其中的例子浅显易懂,相当不错,我就转了过来。注意,我没有对此文完全翻译。
我们直接来看示例,如果我们需要来压缩下面的字符串:
“beep boop beer!”
首先,我们先计算出每个字符出现的次数,我们得到下面这样一张表 :
字符 |
次数 |
‘b’ |
3 |
‘e’ |
4 |
‘p’ |
2 |
‘ ‘ |
2 |
‘o’ |
2 |
‘r’ |
1 |
‘!’ |
1 |
然后,我把把这些东西放到Priority Queue中(用出现的次数据当 priority),我们可以看到,Priority Queue 是以Prioirry排序一个数组,如果Priority一样,会使用出现的次序排序:下面是我们得到的Priority Queue:
接下来就是我们的算法——把这个Priority Queue 转成二叉树。我们始终从queue的头取两个元素来构造一个二叉树(第一个元素是左结点,第二个是右结点),并把这两个元素的priority相加,并放回Priority中(再次注意,这里的Priority就是字符出现的次数),然后,我们得到下面的数据图表:
同样,我们再把前两个取出来,形成一个Priority为2+2=4的结点,然后再放回Priority Queue中 :
继续我们的算法(我们可以看到,这是一种自底向上的建树的过程):
最终我们会得到下面这样一棵二叉树:
此时,我们把这个树的左支编码为0,右支编码为1,这样我们就可以遍历这棵树得到字符的编码,比如:‘b’的编码是 00,’p'的编码是101, ‘r’的编码是1000。我们可以看到出现频率越多的会越在上层,编码也越短,出现频率越少的就越在下层,编码也越长。
最终我们可以得到下面这张编码表:
字符 |
编码 |
‘b’ |
00 |
‘e’ |
11 |
‘p’ |
101 |
‘ ‘ |
011 |
‘o’ |
010 |
‘r’ |
1000 |
‘!’ |
1001 |
这里需要注意一点,当我们encode的时候,我们是按“bit”来encode,decode也是通过bit来完成,比如,如果我们有这样的bitset “1011110111″ 那么其解码后就是 “pepe”。所以,我们需要通过这个二叉树建立我们Huffman编码和解码的字典表。
这里需要注意的一点是,我们的Huffman对各个字符的编码是不会冲突的,也就是说,不会存在某一个编码是另一个编码的前缀,不然的话就会大问题了。因为encode后的编码是没有分隔符的。
于是,对于我们的原始字符串 beep boop beer!
其对就能的二进制为 : 0110 0010 0110 0101 0110 0101 0111 0000 0010 0000 0110 0010 0110 1111 0110 1111 0111 0000 0010 0000 0110 0010 0110 0101 0110 0101 0111 0010 0010 0001
我们的Huffman的编码为: 0011 1110 1011 0001 0010 1010 1100 1111 1000 1001
从上面的例子中,我们可以看到被压缩的比例还是很可观的。
作者给出了源码你可以看看( C99标准) Download the source files
分享到:
相关推荐
Huffman编码是一种基于字符出现频率的无损数据压缩算法,由David A. Huffman在1952年提出。它的核心思想是通过构建一棵特殊的二叉树(Huffman树)来为每个字符分配唯一的二进制编码,使得频繁出现的字符具有较短的...
Huffman 编码是一种基于字符出现频率构建相应前缀码的无损数据压缩算法。 使用方法: 1. 需要安装 OpenCV 和 Numpy 库: pip install opencv-python numpy 2. 直接运行 main.py 脚本即可使用。 压缩原理: 1. 统计...
Huffman 压缩解压工具, ...Huffman 编码压缩/解压算法,实现了对二进制文件进行压缩编码,和解压缩译码功能,界面交互简单友好,易于操作。 详细说明:https://blog.csdn.net/K1052176873/article/details/107117253
Huffman树,又称最优二叉树...总的来说,这个实验旨在让你深入理解Huffman编码和树的构建过程,并通过实际操作体验其在数据压缩中的应用。通过编写和调试代码,你不仅能巩固数据结构知识,还能提高问题解决和编程能力。
本实验报告中,"【实验三】Huffman树及Huffman编码的算法实现"可能包含了详细的代码实现,展示了如何使用编程语言(如C++、Java或Python)来实现上述步骤。实验可能会包括测试不同频率分布的字符集,以及对比不同...
Huffman编码是一种基于字符频率的无损数据压缩算法,由David Huffman在1952年提出。它通过构建一棵特殊的二叉树(Huffman树)来实现对字符的高效编码,使得频繁出现的字符拥有较短的编码,不常出现的字符则编码较长...
Huffman 编码对英文文本的压缩和解压缩 本实验的目的是掌握 Huffman 编码的原理,并使用 VC++ 6.0 开发环境来实现对英文文本的压缩和解压缩。实验要求学生掌握 Huffman 编码的原理、VC++ 开发环境的使用、C 语言...
在这个函数中,首先通过读取文件来统计字符的出现频率,然后按照Huffman编码的算法构建Huffman树,并最终生成编码。特别地,为了确保编码的正确性,程序采用了深度优先搜索的方式遍历Huffman树,为每个字符分配编码...
Huffman编码作为一种基于概率的无损数据压缩算法,以其高效的压缩比和简单的实现机制受到了广泛的关注。本文将详细介绍如何使用Huffman编码对ASCII码文件进行压缩,并提供一个用C语言实现的具体示例。 #### 二、...
# 基于C++的Huffman编码压缩解压系统 ## 项目简介 本项目是一个基于C++实现的Huffman编码压缩解压系统。通过Huffman编码算法,项目能够对文本文件进行高效的压缩和解压操作,模拟了从编码、压缩、解压到译码的完整...
Huffman编码是一种基于字符频率的无损数据压缩算法,由David A. Huffman于1952年提出。C++作为一门强大的编程语言,非常适合实现这类算法。本篇文章将详细探讨Huffman压缩与解压算法及其在C++中的实现。 一、...
Huffman编码是一种常见的无损数据压缩算法,它利用字符出现频率的不同,构建最优的二叉树来进行编码,从而达到压缩数据的目的。本篇文章将深入探讨基于Huffman编码的Java实现,分析其工作原理并解析提供的Java源代码...
【HUFFMAN编码的压缩与解压】是一种数据压缩技术,它基于Huffman算法。Huffman编码是一种可变长度的前缀编码方法,主要用于降低数据存储空间需求和网络传输的数据量。 **一、数据压缩的意义** 数据压缩在信息技术...
纯qt5.3库编的程序所有源代码。 1.huffman编码 2.基于huffuman编码的压缩解压缩 3.基于huffuman编码的网络通信局域网聊天 4.sqlite数据库用户登入注册系统功能 5.基于QT画huffman树算法
Huffman压缩算法是一种高效的数据编码方法,主要用于无损数据压缩。该算法由David A. Huffman在1952年提出,其核心思想是利用字符出现频率的差异来创建一棵最优二叉树,使得频繁出现的字符能用较短的编码表示,而较...
在实际应用中,自适应Huffman编码算法能显著提高压缩率,增强数据传输的效率。这一点在大量数据传输,尤其是音视频等多媒体信息的处理中显得尤为重要。通过提高数据压缩比,可以有效减轻存储和传输资源的压力。 在...
Huffman编码是一种高效的数据压缩算法,由David A. Huffman在1952年提出,主要用于文本数据的压缩。它的核心思想是构建一棵特殊的二叉树——哈夫曼树,通过这棵树来为每个字符生成一个唯一的前缀编码,使得频繁出现...
Huffman编码是一种高效的数据压缩算法,它基于字符出现频率构建最优前缀树,进而为每个字符分配唯一的二进制编码。在Java环境下实现Huffman编码,我们需要理解以下几个关键概念: 1. **字符频率统计**:首先,我们...
在“哈夫曼 huffman压缩算法”的项目中,开发了一个基于Visual C++ (VC++)的Windows图形用户界面工程,用于实现文件的压缩和解压缩功能。这个实验设计旨在帮助大学计算机专业的学生深入理解数据结构,特别是树和图的...
在数据压缩技术中,Huffman编码是一种广泛使用的无损数据压缩算法,它基于字符频率进行编码,使得频繁出现的字符拥有较短的编码,从而提高压缩效率。本项目将深入探讨如何使用C语言实现Huffman树和Huffman编码。 ...