我试图通过霍夫曼算法手动解决两种不同的压缩方案,在每一种情况下,我们从一个包含元组(symbol, frequency)
的有序队列开始,我们将尝试形成字典:
step 0:
[c:3] [b:4] [a:5]
step 1:
[a:5] [7]
[c:3] [b:4]
step 2:
[12]
[a:5] [7]
[c:3] [b:4]
如果我们认为左边是0而右边是1,那么我们有字典:
a -> 0
b -> 11
c -> 10
直到现在,一切看起来都是对的。但是我们假设我们的初始队列类似于以下内容,而不是:
step 0:
[c:1] [b:2] [a:4]
step 1:
[3] [a:4]
[c:1] [b:2]
step 2:
[7]
[3] [a:4]
[c:1] [b:2]
产生以下字典:
a -> 1
b -> 01
c -> 00
似乎不正确(a
和b
都相同)。
我做错了什么?我可以做一个if
在树的根部看到哪一个树枝实际上是一片叶子,选择那个方向作为1的方向,但这对我来说似乎并不干净。我想我一定错过了什么?
答案 0 :(得分:2)
比特序列不相等。如果你有一个像:
这样的字符串01100
然后它只能解压缩为“bac”。您必须以保留序列中前导零的方式存储压缩结果,例如,上面的内容可以填充到01100000或00001100以填充输出的一个字节,然后与长度5一起存储。当然问题是只有输出的第一个或最后一个字节,具体取决于您选择填充哪一侧。
答案 1 :(得分:1)
关键是字典中的序列位在解码时不应引起歧义。序列的值无关紧要。
在霍夫曼编码中通过只有编码树中的叶子可以保持要编码的字符的条件来解决模糊性。上面的树遵循此规则,因此生成的编码没有问题。