【问题标题】:Canonical huffman encoding algo规范霍夫曼编码算法
【发布时间】:2016-01-01 21:55:46
【问题描述】:

您好,我正在尝试实现 Canonical huffman 编码,但我不懂 wiki 和 google 指南, 我需要更抽象的解释...

我试过这个: 1.获取常规霍夫曼编码长度的代码列表。像这样:

A - code: 110, length: 3.
B - code: 111, length: 3.
C - code: 10, length 2.
D - code: 01, length 2.
E - code: 00, length 2.
  1. 我按符号和长度对表格进行排序,如下所示:
C - code: 10, length 2.
D - code: 01, length 2.
E - code: 00, length 2.
A - code: 110, length: 3.
B - code: 111, length: 3.

现在我不知道如何继续......

很多

【问题讨论】:

    标签: algorithm huffman-code canonical-link


    【解决方案1】:

    扔掉你从霍夫曼算法中得到的代码。你不需要那些。保持长度即可。

    现在根据长度和符号分配代码。按长度排序,从最短到最长,在每个长度内,按升序对符号进行排序。 (你如何做到这一点并不重要,只要每个符号严格小于或大于任何其他符号,并且编码器和解码器就如何做到这一点达成一致。)

    所以我们进行排序:

    C - 2
    D - 2
    E - 2
    A - 3
    B - 3
    

    二先三,二内依次为C、D、E,三内依次为A、B。

    现在我们在每个长度内按整数顺序分配代码,每次增加长度时在末尾添加一个零位:

    C - 2 - 00
    D - 2 - 01
    E - 2 - 10
    A - 3 - 110 <- after incrementing to 11, a zero was added to make 110
    B - 3 - 111
    

    这是一个规范的代码。

    如果你喜欢并且仍然是规范的,你可以用其他方式来做,例如只要编码器和解码器就该方法达成一致,从 11 开始倒数。重点是只需将每个符号的长度从编码器传输到解码器,而不必传输占用更多空间的代码本身。

    【讨论】:

    • 你好。感谢您的回答。我一直在寻找同样的东西。我没有得到的是您以“整数顺序”分配代码的方式。我的意思是,不是 00 = 0, 01=1, 10=2 , 110 = 6, 111 = 7 吗?为什么我们从 2 跳到 6?还是不是二进制顺序,整数顺序还有别的意思?
    • @BogdanDaniel 这在答案的灰色框中进行了解释。当您进入下一个长度时,您在末尾添加零位。整数顺序在每个长度内。
    • 谢谢。我现在明白了。我错过了“每个长度”位。
    【解决方案2】:

    您应该按频率对符号进行排序,因此最常见的是在顶部,而最不常见的是在底部。 (总频率 - 1):

    A (0.5)
    B (0.2)
    C (0.15)
    D (0.15)
    

    然后用0标记一个符号,用1标记另一个符号,将频率相加并插入到列表中的适当位置,然后再用01标记最少两个:

    A (0.5)      A (0.5)
    B (0.2)      C&D (0.3) 0
    C (0.15) 0   B (0.2)   1
    D (0.15) 1
    

    又一次……

    A (0.5)      A (0.5)        A (0.5)      0
    B (0.2)      C&D (0.3) 0    B&C&D (0.5)  1
    C (0.15) 0   B (0.2)   1
    D (0.15) 1
    

    直到您获得最后一对。 由01 标记的从尾部到符号的路径将是相应的霍夫曼代码:

    A 0
    B 11
    C 100
    D 101
    

    【讨论】:

    • 另外,OP 正在专门询问 canonical 霍夫曼代码。
    • 查找“规范的霍夫曼代码”。你完全不明白。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多