哈夫曼编码的真实世界应用有哪些?

29

我被告知Huffman编码被用作无损数据压缩算法,但同时我也听说现实中的数据压缩软件并不采用Huffman编码,因为如果键的分布不够分散,压缩后的文件甚至可能比原始文件还要大。

这让我想知道Huffman编码是否有任何真实世界的应用?


6
有人告诉你谎话了。 - Will
2
说实话,“是否存在真实世界中的非哈夫曼压缩?”这个问题会更有趣(虽然确实存在,但更有趣),因为哈夫曼编码/压缩和自适应哈夫曼编码/压缩在现实世界中取得了成功。告诉你“真实数据压缩软件不使用哈夫曼”这种说法是错误的。 - SyntaxT3rr0r
6个回答

39
Huffman被广泛应用于所有主流的压缩格式,例如GZIP、PKZIP(winzip等)和BZIP2,以及图像格式,如JPEG和PNG。
所有的压缩方案都存在无法有意义地压缩的病态数据集;当遇到这些文件时,我列出的存档格式仅会将它们“存储”为未经压缩的文件。
由于专利问题,新的算术编码和区间编码方案通常会被避免使用,这意味着Huffman仍然是压缩行业的主力。

1
那么你的意思是,霍夫曼其实是压缩行业的“基础”,如果不是“核心”? - Jichao
1
当然。那正是我所指的。 - Will
25
是的,你的问题就像是在问“给我举一个由钢铁制成的汽车的例子”。 - Hogan
3
我从未听说过压缩工业。你是不是指软件行业? - Hogan

5
请参见维基百科有关该主题的文章:Huffman编码的应用
引用:

Huffman编码现在通常被用作其他压缩方法的“后端”。 DEFLATE(PKZIP的算法)和多媒体编解码器,如JPEG和MP3,都具有前端模型和量化,然后是Huffman编码。


3
"后端"是指网站或应用程序的服务器端,负责处理数据和逻辑。而"前端"则是指用户在浏览器中看到的网站或应用程序的界面和交互部分。 - Jichao
1
@jcyang:它们只是系统的两个不同部分。后端可能更接近于编写文件,前端可能更接近于读取文件的位置。 - Hogan
1
“后端”指的是对已经进行了预处理并可能使用其他算法进行压缩的值进行编码。例如,DEFLATE使用LZ77对重复序列进行编码,然后使用Huffman对不在序列中的字符进行编码。 - Will

3

哈夫曼编码有许多实际应用。ZIP 是使用哈夫曼编码作为基础的最广泛使用的压缩工具。Google 最新推出的最高效无损压缩算法 Brotli Compression 也使用了哈夫曼编码,此外,Brotli 还使用 LZ77 和其他一些基本的无损压缩算法。请参阅Brotli。


2
当考虑压缩算法时,通常每种算法都有其优点和缺点。压缩的本质是,对于一组输入数据,存在更好和更差的压缩算法。
Huffman 算法在某些方面非常出色。尤其是对于重复顺序很多且包含字符空间子集的数据,例如英文文本文件。英语文本通常有相同的字母后跟相同的其他字母。
如果您的教授或书上给您的印象是 Huffman 算法不再使用,那么他们是错误的。例如,几乎所有与互联网通信的内容在某个时候都会使用 Huffman 编码(许多通信协议使用它)。大多数图像文件(JPEG)都是 Huffman 编码的。大多数音乐文件(MP3)也是 Huffman 编码的。还有许多其他例子。
Huffman 被使用的一个原因是,可以通过略微不同的自适应 Huffman 算法“发现”它。当你读取文件时,学习 Huffman 代码并“边读边压缩”。这是一个简化的概述,但你明白了。
为解决如何针对特定情况使用最佳算法的问题,zip 文件允许使用多种不同的压缩方式,具体取决于给定文件的最佳压缩方式。

Huffman并非“发现” - 它不是基于流的。虽然有基于流的“自适应”Huffman变体,但它们与普通Huffman算法有足够的不同,以至于如果你仅仅说“Huffman”,没有人会认为你指的是自适应变体。 - Will
1
它使用哪些互联网协议? - Will
互联网协议是错误的术语——我想说的是通信协议。正在更改。 - Hogan

2

0

Huffman编码用于将固定长度的编码转换为可变长度的编码,从而实现无损压缩。可变长度的编码可以使用JPEG和MPEG技术进一步压缩,以获得所需的压缩比。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接