【问题标题】:What are the real-world applications of huffman coding?霍夫曼编码的实际应用是什么?
【发布时间】:2011-01-13 01:14:21
【问题描述】:

有人告诉我,霍夫曼编码被用作无损数据压缩算法,但我也被告知,真正的数据压缩软件使用霍夫曼编码,因为如果密钥分布不够分散,压缩后的文件可能比原始文件还要大。

这让我想知道霍夫曼编码是否有任何实际应用?

【问题讨论】:

  • 有人告诉你小猪。
  • 老实说,“现实世界中有非霍夫曼压缩吗?”看到 Huffman 和 Adaptive Huffman 编码/压缩的 Real-World[TM] 成功将是一个更有趣的问题(有,但会更有趣)。那个告诉你“真正的数据压缩软件不使用霍夫曼”的人,他自己的想法是不对的。

标签: algorithm compression huffman-code


【解决方案1】:

一个非常广泛的应用是HPACK中的字符串编码,http/2header compression技术。

RFC 确实直接提供了一个Huffman Code Table,该Huffman Code Table 已针对压缩 HTTP 标头进行了优化。

【讨论】:

    【解决方案2】:

    哈夫曼编码在现实世界中有很多应用。 ZIP 可能是使用最广泛的压缩工具,它使用 Huffman 编码作为其基础。谷歌上个月发布的最新最高效的无损压缩算法 Brotli Compression 也使用了 Huffman Coding。除此之外,Brotli 还使用 LZ77 和其他一些基本的无损压缩算法。参考Brotli.

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        在考虑压缩算法时,每种算法通常都有优点和缺点。压缩的本质是给定一组输入,该数据存在更好和更差的压缩算法。

        霍夫曼确实非常擅长某些事情。最值得注意的是重复顺序很多并包含字符空间子集的数据。例如英语文本文件。英语往往有相同的字母后跟相同的其他字母。

        如果你的教授或书给你的印象是没有使用霍夫曼,那他们就错了。例如,几乎所有与互联网的通信和来自互联网的通信都在某些时候进行了霍夫曼编码。 (许多通信协议都使用它。)大多数图像文件(jpeg)都是霍夫曼编码的。大多数音乐文件 (mp3) 都是霍夫曼编码的。还有很多其他的例子。

        使用 Huffman 的一个原因是因为它可以通过称为自适应 Huffman 的稍微不同的算法“发现”。当您阅读该文件时,您会了解 Huffman 代码并“随时压缩”。这是一个简化的概述,但您明白了。

        为了解决使用最佳算法的情况问题,zip 文件允许使用多种不同的压缩方式,具体取决于给定文件的最佳压缩方式。

        【讨论】:

        • 霍夫曼未被“发现”——它不是基于流的。有基于流的“自适应”霍夫曼变体,但它们有很大的不同,如果您简单地说“霍夫曼”,没人会认为您是指自适应变体。
        • 哪些互联网协议使用它?
        • 互联网协议是错误的术语——我的意思是通信协议。改变它。
        【解决方案5】:

        Huffman 广泛用于您可能遇到的所有主流压缩格式 - 从 GZIP、PKZIP(winzip 等)和 BZIP2,到 JPEG 和 PNG 等图像格式。

        所有压缩方案都有无法进行有意义压缩的病态数据集;我上面列出的存档格式只是在遇到此类文件时“存储”未压缩的文件。

        较新的arithmetic and range coding 方案经常因为patent issues 而被避免,这意味着霍夫曼仍然是压缩行业的主力军。

        【讨论】:

        • 所以你的意思是哈夫曼实际上是压缩行业的“基础”,如果不是“核心”?
        • 当然。这正是我的意思。
        • 是的,你的问题就像是在问“给我一个钢制汽车的例子。”
        • 我从未听说过压缩行业。你不是说软件行业吗?
        【解决方案6】:

        参见Wikipedia有关该主题的文章:

        如今,霍夫曼编码经常被用作其他压缩方法的“后端”。 DEFLATE(PKZIP 的算法)以及 JPEG 和 MP3 等多媒体编解码器具有前端模型和量化,然后是 Huffman 编码。

        【讨论】:

        • 什么是“后端”?什么是“前端”?
        • @jcyang:它们只是系统的两个不同部分。后端可能更接近于写入文件,而前端可能接近于读取文件的位置。
        • 'backend' 表示已首先预处理并可能使用另一种算法压缩的值的编码。例如,DEFLATE 使用 LZ77 编码重复序列,然后使用 Huffman 编码那些不在序列中的字符。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多