我没有得到Golomb / Rice编码:它确实输入了更多的输入,或者是它?

时间:2009-04-08 08:04:17

标签: compression

或者,也许,我没有得到的是unary coding

Golomb, or Rice, coding中,您将数字N拆分为两部分,再将其除以另一个数字M,然后将该部门的整数结果编码为一元,其余为二进制。

在维基百科example中,他们使用42作为N而使用10作为M,因此我们最终使用商数q为4(在一元中:1110)余数r为2(二进制010),因此结果消息为1110,010或8位(可以跳过逗号)。 42的简单二进制表示是101010或6位。

对我而言,这似乎是由于q的一元表示,它总是必须比二进制更多位。

显然,我在这里错过了一些重要的观点。它是什么?

2 个答案:

答案 0 :(得分:18)

重要的一点是,Golomb代码并不意味着比一个特定数字的最短二进制编码短。相反,通过提供特定类型的variable-length encoding,如果编码值来自大范围,则减少每个编码值的平均长度与固定宽度编码相比,但是最常见的值通常很小(因此大部分时间只使用该范围的一小部分)。

例如,如果您要传输0到1000范围内的整数,但绝大多数实际值在0到10之间,则在固定宽度编码中,大多数传输的代码会有前导0,不包含任何信息:

要覆盖0到1000之间的所有值,需要使用固定宽度二进制的10位宽编码。现在,由于你的大部分价值都低于10,所以至少大多数数字的前6位都是0,而且信息很少。

要使用Golomb代码纠正此问题,您可以将数字除以10,然后分别编码商和余数。对于大多数值,所有必须传输的是剩余部分,最多可以使用4位进行编码(如果使用截断的二进制数,则余数可以更少)。然后,商在一元中传输,对于10以下的所有值,编码为单0位,对于10..19为10,对于20..29等为110 < / p>

现在,对于大多数值,您已将消息大小减小到最多5位,但仍然可以在没有分隔符的情况下明确地传输所有值。

对于较大的值,成本相当高(例如,990..999范围内的值需要100位商数),这就是为什么编码对于双面几何分布是最佳的。

较大值的商中的1位长行程可以通过后续的行程编码来解决。但是,如果商在消息中占用太多空间,则可能表示其他代码可能比Golomb / Rice更合适。

答案 1 :(得分:2)

Golomb编码和二进制代码之间的一个区别是二进制代码不是前缀代码,对于任意大数字的编码字符串是不行的(你不能决定1010101010101010是10101010和10101010的串联还是什么的其他)。因此,它们不容易比较。

其次,Golomb代码对于几何分布是最佳的,在这种情况下使用参数2 ^( - 1/10)。 42的概率约为0.3%,因此您可以了解这对于输出字符串的长度有多重要。