或者,也许,我没有得到的是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
的一元表示,它总是必须比二进制更多位。
答案 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%,因此您可以了解这对于输出字符串的长度有多重要。