下面的解释来自维基百科,关于使用包合并的长度受限的霍夫曼代码。我无法理解,我对此有一些疑问。
设 L 是允许任何代码字具有的最大长度。设 p 1 ,..., p n 为符号的频率要编码的字母表。我们首先对符号进行排序,以便 p i ≤ p i 子> 1。为每个符号创建 L 硬币,面额为2 -1 ,...,2 - L ,每个都是钱币值 p i 。使用包合并算法选择最小钱币值的硬币集合,其面额总计为n - 1.让 h i 为数字选择了钱币值 p i 的硬币。最佳长度限制的霍夫曼代码将使用长度 h i 的位串编码符号 i 。“< / p>
答案 0 :(得分:1)
也许它只是构建霍夫曼代码的另一种方法。你看过http://cbloomrants.blogspot.com/2010/07/07-02-10-length-limitted-huffman-codes.html了吗? IMO包合并算法没有构建一个霍夫曼树。你想寻找哥伦布码。
答案 1 :(得分:1)
是的,它只是一种构建限制代码字长度的霍夫曼代码的方法。
霍夫曼代码使用可以唯一确定的二进制字符串对字母表中的每个字母进行编码。例如,如果您的字母表是{A,B,C}且A比B和C更常见,则以下编码可以很好地运行:
A - 0
B - 10
C - 11
编码字符串如0010110可以进行唯一编码,因为编码位字符串的长度已经由霍夫曼代码定义(这里---每个以0开头的字符串长度为1,每个字符串都与1的长度为2)。所以字符串解码为0 | 0 | 10 | 11 | 0 = AABCA。
现在问题&#34;在构造霍夫曼码时,如何选择编码比特串,使得得到的编码平均尽可能短。在您的问题中,还有一个额外的约束,即任何代码字的长度不能超过 L 。一般的想法是使用较短的字符串来编码更常见的符号。
包合并算法的细节并不重要,因为关键是您使用算法来选择最小钱币值的硬币集合,其面额总计 n - 1&#34;。如果您的硬币面额为2 -1 ,2 -2 ,...,并且您希望从中构建总价值100美分,您可以想到这个过程首先得到一个价值100的硬币,然后将其分成两个50美分(2 -1 ),然后根据需要继续将你的硬币分成两半,例如50美分+ 25美分+ 12.5美分+ 12.5美分。这对应于二叉树的构造;无论何时拆分硬币,都可以在二叉树中创建一个内部节点,并在一个层次上添加两个叶子。
现在,最小化钱币价值的想法是那些&#34;硬币&#34;那些与更高频率相关的&#34;符号使用起来更加昂贵,因此您希望将这些硬币拆分得更少,相当于使用更短的代码。
详细信息留给读者练习。