【问题标题】:package-merge algorithm for length-limited huffman codes长度受限霍夫曼码的包合并算法
【发布时间】:2011-04-24 22:06:06
【问题描述】:
下面的解释来自维基百科关于使用包合并的长度限制霍夫曼代码。我不明白,我对此有一些疑问。
- 我们如何打包?
- 我们如何合并?
- 我们如何识别符号位串的长度?
令 L 为任何代码字允许具有的最大长度。令 p1, ..., pn 为要编码的字母表。我们首先对符号进行排序,使得 pi ≤ pi +1。为每个符号创建 L 个硬币,面额为 2-1, ..., 2-L,每个硬币值 pi。使用包合并算法选择最小钱币值的硬币集合,其面额总数为 n - 1。令 hi 为数字硬币价值 pi 被选中。最佳长度限制霍夫曼码将使用长度为 hi 的位串编码符号 i。"
【问题讨论】:
标签:
algorithm
huffman-code
【解决方案2】:
是的,这只是一种构建对码字长度有限制的霍夫曼码的方法。
霍夫曼编码用一个可以唯一确定的二进制字符串对字母表中的每个字母进行编码。例如,如果您的字母表是 {A, B, C} 并且 A 比 B 和 C 更常见,则以下编码可以很好地工作:
A - 0
B - 10
C - 11
0010110 这样的编码字符串可以被唯一编码,因为编码位字符串的长度已经由霍夫曼代码定义(这里 --- 每个以 0 开头的字符串的长度为 1,并且每个以1 的长度为 2)。所以字符串解码为 0|0|10|11|0 = AABCA。
现在构建霍夫曼码的“问题”是如何选择编码位串,以使生成的编码平均尽可能短。在您的问题中,还有一个额外的约束,即任何代码字的长度都不能超过 L。总体思路是使用较短的字符串来编码更常见的符号。
package-merge 算法的细节并不重要,因为关键是您使用一种算法来选择“一组具有最小钱币价值的硬币,其面额总计 n - 1”。如果您有面额为 2-1、2-2、...的硬币,并且您想从中建立 100 美分的总价值,您可以考虑这个过程首先有一个价值 100 的硬币,然后将它分成两个 50 美分 (2−1),然后继续将你的硬币分成两半,只要你想要,例如50 美分 + 25 美分 + 12.5 美分 + 12.5 美分。这对应于二叉树的构造;每次拆分硬币时,都会在二叉树中创建一个内部节点,并在更深的一层添加两个叶子。
现在最小化钱币价值的想法是那些与“高频”符号相关联的“硬币”使用起来更昂贵,因此您希望减少这些硬币的分割,对应于具有更短的代码。
细节留给读者作为练习。