长度受限的霍夫曼码的打包合并算法
|
以下说明来自Wikipedia,有关使用程序包合并的长度受限的霍夫曼代码。我不明白,对此我有一些疑问。
我们如何包装?
我们如何合并?
我们如何识别符号的位串的长度?
令L为任何代码字所允许的最大长度。令p1,…,pn为要编码的字母符号的频率。我们首先对符号进行排序,以使pi≤pi + 1。为每个符号(币值2-1,…,2-L)创建L个硬币。使用包合并算法选择面额总计为n − 1的最小钱币值的硬币集。令hi为所选钱币值pi的硬币数。最佳的受长度限制的霍夫曼代码将使用长度为hi的位字符串对符号i进行编码。
没有找到相关结果
已邀请:
2 个回复
磁辫覆氓
稍惮
诸如0010110之类的编码字符串可以进行唯一编码,因为编码位字符串的长度已经由霍夫曼代码定义(在这里-每个以0开头的字符串的长度为1,每个以1开头的字符串的长度都为2)。因此,字符串解码为0 | 0 | 10 | 11 | 0 = AABCA。 现在,构造霍夫曼代码时的“问题”是如何选择编码位串,以使所得到的编码平均而言尽可能短。在您的问题中,还有一个附加约束,即任何代码字的长度都不能超过L。通常的想法是使用较短的字符串来编码更常见的符号。 打包合并算法的细节并不重要,关键在于您要使用一种算法来选择\“面额总计为n-1 \的最小钱币值的硬币集”。如果您有面额为2-1、2-2,...的硬币,并且想要从中建立100美分的总价值,则可以认为此过程首先具有价值100的硬币,然后拆分它变成两个50美分(2-1),然后继续将硬币分成所需的一半,例如50美分+ 25美分+ 12.5美分+ 12.5美分。这对应于二叉树的构造。每当拆分硬币时,您都将在二叉树中创建一个内部节点,并在更深一层上添加两片叶子。 现在,最小化货币价值的想法是,与“较高频率”符号链接的“硬币”使用起来更昂贵,因此您希望将这些硬币拆分得更少,这与使用较短的代码相对应。 这些细节留给读者练习。