我刚刚读过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 011
或baec
!没有任何歧义,因为0
和01
和0100
毫无意义。
我明白了这个要点,但我不明白(a)它是如何找到的,以及(b)您如何知道它的工作原理,或者(c)它的确切含义。特别是这一行描述了它:
因此,如果我们写下
010001001011
,我们可以看到它是010 00 1001 011
....
我看到这些就是代码,但是我不明白您怎么知道不将其读为0100 01 0010 11
。我看到这些值实际上不是表中的代码。但是,我看不出您将如何解决这个问题!我想知道如何发现这一点。如果我试图修改这样的代码和位,我会这样做:
10 100 1000 101 1001
1010010001011001
。10
还是哎呀,不,101
也... Darnit,也许我可以为代码的解析添加一个优先级,所以10
是优先级高于101
。这使我10 100 1000 10 x
不能接受,最后10个应该是101。Dangit。因此,我将尝试添加诸如优先级功能之类的其他功能,或目前我无法想到的其他功能,以查看它是否有助于解决问题。
我无法想象他们会如何发现霍夫曼编码中的这些代码可以被唯一地解析(我仍然看不到它,它实际上是如何实现的,我必须写一些例子才能看到它,或者,...这是问题的一部分,如何查看是真的,甚至如何证明它)。想知道是否可以更深入地解释它是如何工作的,以及如何被发现(或如何自己发现类似的东西)。
答案 0 :(得分:5)
霍夫曼代码通过在树中布置数据来工作。如果您有一棵二叉树,则可以通过说左子节点对应于0的位,右子节点对应于1的方式将每个叶子与代码关联。从根到叶子的路径对应于not中的代码。模棱两可的方式。
这适用于任何树,并且prefix属性基于叶子是末端的事实。因此,您无法通过另一个叶子(以另一个代码为前缀)进入叶子(有代码)。
霍夫曼编码的基本思想是,您可以通过以下方式来构建树:每个节点的深度与节点出现的概率相关(可能发生的代码越接近根部)。>
有几种算法可以构建这样的树。例如,假设您有一组要编码的项目,例如a..f。您必须知道每个项目出现的概率,这要归功于源模型或实际值分析(例如,通过分析文件进行编码)。
然后您可以:
对于前一棵树,它可能对应于一组概率
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属性是通过构造保证的。