霍夫曼编码如何找出编码唯一的性质

时间:2019-02-12 04:59:10

标签: encoding compression bit-manipulation huffman-code

我刚刚读过this

  

这是一个叫做霍夫曼编码的真正聪明的想法出现的地方!想法是,我们用类似

的代码表示字符(例如a,b,c,d,...)。
a: 00
b: 010
c: 011
d: 1000
e: 1001
f: 1010
g: 1011
h: 1111
     

如果仔细看这些,您会发现一些特别的地方!这些代码都不是其他任何代码的前缀。因此,如果我们写下010001001011,我们可以看到它是010 00 1001 011baec!没有任何歧义,因为0010100毫无意义。

我明白了这个要点,但我不明白(a)它是如何找到的,以及(b)您如何知道它的工作原理,或者(c)它的确切含义。特别是这一行描述了它:

  

因此,如果我们写下010001001011,我们可以看到它是010 00 1001 011 ....

我看到这些就是代码,但是我不明白您怎么知道不将其读为0100 01 0010 11。我看到这些值实际上不是表中的代码。但是,我看不出您将如何解决这个问题!我想知道如何发现这一点。如果我试图修改这样的代码和位,我会这样做:

  1. 使用一组代码,例如10 100 1000 101 1001
  2. 尝试写出一些代码示例。因此,也许一个示例就是按照上面的顺序串联代码:1010010001011001
  3. 看看我是否可以解析代码。所以10还是哎呀,不,101也... Darnit,也许我可以为代码的解析添加一个优先级,所以10是优先级高于101。这使我10 100 1000 10 x不能接受,最后10个应该是101。Dangit。

因此,我将尝试添加诸如优先级功能之类的其他功能,或目前我无法想到的其他功能,以查看它是否有助于解决问题。

我无法想象他们会如何发现霍夫曼编码中的这些代码可以被唯一地解析(我仍然看不到它,它实际上是如何实现的,我必须写一些例子才能看到它,或者,...这是问题的一部分,如何查看是真的,甚至如何证明它)。想知道是否可以更深入地解释它是如何工作的,以及如何被发现(或如何自己发现类似的东西)。

1 个答案:

答案 0 :(得分:5)

霍夫曼代码通过在树中布置数据来工作。如果您有一棵二叉树,则可以通过说左子节点对应于0的位,右子节点对应于1的方式将每个叶子与代码关联。从根到叶子的路径对应于not中的代码。模棱两可的方式。

enter image description here

这适用于任何树,并且prefix属性基于叶子是末端的事实。因此,您无法通过另一个叶子(以另一个代码为前缀)进入叶子(有代码)。

霍夫曼编码的基本思想是,您可以通过以下方式来构建树:每个节点的深度与节点出现的概率相关(可能发生的代码越接近根部)。

有几种算法可以构建这样的树。例如,假设您有一组要编码的项目,例如a..f。您必须知道每个项目出现的概率,这要归功于源模型或实际值分析(例如,通过分析文件进行编码)。

然后您可以:

  1. 按概率对项目进行排序
  2. 拾取概率最低的两个项目
  3. 删除这些项目,将它们分组在新的复合节点中,然后将一项分配给左子项(代码0),将另一项分配给右子项(代码1)。
  4. 复合节点的概率是各个概率的总和,并将此新节点插入排序的项目列表中。
  5. 转到2,而项数为> 1

对于前一棵树,它可能对应于一组概率

a(0.5)b(0.2)c(0.1)d(0.05)e(0.05)f(0.1)

然后选择概率最低的项(d和e),将它们分组在复合节点(de)中,并获得新列表

a(0.5)b(0.2)c(0.1)(de)(0.1)f(0.1)

连续的项目列表可以是

a(0.5)b(0.2)c(de)(0.2)f(0.1)

a(0.5)b(0.2)(c(de))f(0.3)

a(0.5)b((c(de))f)(0.5)

a(b((((c(de))f))1.0

因此prefix属性是通过构造保证的。