【问题标题】:Huffman coding for Lossless Compression用于无损压缩的霍夫曼编码
【发布时间】:2011-04-15 11:57:39
【问题描述】:

对于无损压缩的霍夫曼编码,我真的需要帮助。我即将参加考试,需要了解这一点,有没有人知道为理解这一点而制作的简单教程,或者有人可以解释一下。

考试中的问题可能是:

假设字母表为[A,B,C],已知概率分布为P(A)=0.6, P(B)=0.2 和 P(C)=0.2。为简单起见,我们还假设编码器和解码器都知道 消息的长度始终为 3,因此不需要终止符。

  1. 通过霍夫曼编码对消息 ACB 进行编码需要多少位?你需要 为每个符号提供霍夫曼树和霍夫曼代码。 (3 分)

  2. 通过算术编码对消息 ACB 进行编码需要多少位?你需要 提供编码过程的详细信息。 (3 分)

  3. 使用上述结果,讨论算术编码相对于霍夫曼编码的优势。 (1 分)

答案:

  1. 霍夫曼代码:A - 1、B - 01、C - 00。 编码结果为 10001,所以需要 5 位。 (3 分)

  2. 算术编码的编码过程: 符号 低高范围 0.0 1.0 1.0 一个 0.0 0.6 0.6 C 0.48 0.6 0.12 B 0.552 0.576 0.024 最终的二进制码字是 0.1001,也就是 0.5625。因此需要 4 位。 (3 分)

  3. 在霍夫曼编码中,每个符号的码字长度必须是整数。但它 在算术编码中可以是分数。因此算术编码通常更有效 比霍夫曼编码,如上图所示。 (1 分)

【问题讨论】:

  • 哇,你很擅长猜测你的未来任务是什么。甚至到每个问题的分数!
  • 大声笑,这是一个练习题,但讲师说这将是相似的,他只会改变周围的数字。
  • 嗯...好吧。你有什么问题?这些都应该包含在你的教科书中。
  • 教科书比较繁琐,对初学者没有真正的讲解。我在解决第一个问题时遇到了麻烦,我已经把答案放在上面了。不知道他是怎么得到答案的。
  • 如果需要在 Mathematica 上执行此操作,这可能会有所帮助。 academia.edu/19699746/Huffman_Code_on_Mathematica_using_Trees

标签: lossless-compression huffman-code


【解决方案1】:

http://en.wikipedia.org/wiki/Huffman_coding

如果您查看树(右上角),您会看到每个父节点都是其下方两个节点的总和。节点处的值是字母的频率。二进制序列中的每一位都是树中的一个右/左分支。

这有帮助吗?

我真的不知道Arithmetic coding,但它看起来很聪明。

【讨论】:

    【解决方案2】:

    哈夫曼树是一棵二叉树,其节点表示流中分布最高的值,在根附近被压缩,而在离根越远的地方,分布越低的值,因此可以对更常见的值进行编码在较短的位字符串中,而不太常见的值在较长的字符串中编码。

    哈夫曼树的构造如下:

    1. 在源流中构建实体表及其分布。
    2. 选择表中分布最低的两个条目。
    3. 从这两个条目中创建一个树节点。
    4. 从表中删除刚刚使用的条目。
    5. 向表中添加一个新条目,其中包含刚刚删除的节点的组合分布以及树节点。
    6. 如果表格中还有多个条目,请转到第 2 步。
    7. 表格中留下的条目是您的根。

    【讨论】:

      【解决方案3】:

      基本的哈夫曼实现可以很好。但是,如果您从头开始构建,您的工具箱中可能需要超过 1 个其他数据结构来使事情变得更容易,例如 minHeap 和位向量。编码和解码的基本算法非常简单。没有与算术编码比较的信息。

      An implementation example

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多