Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Compression 我不知道';t获得Golomb/Rice编码:它确实会产生更多的输入位,还是会?_Compression - Fatal编程技术网

Compression 我不知道';t获得Golomb/Rice编码:它确实会产生更多的输入位,还是会?

Compression 我不知道';t获得Golomb/Rice编码:它确实会产生更多的输入位,还是会?,compression,Compression,或者,也许,我不明白的是: 在中,通过将一个数除以另一个数M,将该数N分成两部分,然后将该除法的整数结果编码为一元,其余部分编码为二元 在维基百科中,他们使用42作为N和10作为M,因此我们得到的商q为4(一元数:1110),余数r为2(二进制010),因此生成的消息为1110010,或8位(可以跳过逗号)。42的简单二进制表示是101010,或6位 对我来说,这似乎是因为q的一元表示必须比二进制多比特 很明显,我遗漏了一些重要的观点。这是什么?Golomb编码和二进制编码之间的一个区别是二进制

或者,也许,我不明白的是:

在中,通过将一个数除以另一个数
M
,将该数
N
分成两部分,然后将该除法的整数结果编码为一元,其余部分编码为二元

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

对我来说,这似乎是因为
q
的一元表示必须比二进制多比特


很明显,我遗漏了一些重要的观点。这是什么?

Golomb编码和二进制编码之间的一个区别是二进制编码不是前缀码,这对于编码任意大的数字字符串来说是不可能的(您无法确定1010101010101010是10101010和10101010的串联还是其他东西)。因此,它们并不容易比较


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

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

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

要覆盖0到1000之间的所有值,需要在固定宽度的二进制文件中进行10位宽的编码。现在,由于您的大多数值都低于10,所以大多数数字的前6位至少为0,并且携带的信息很少

要用Golomb代码纠正这一点,您可以将数字除以10,然后分别对商和余数进行编码。对于大多数值,必须传输的只是余数,它最多可以使用4位进行编码(如果对余数使用截断二进制,则可以更少)。然后以一元数传输商,对于10以下的所有值,该商编码为单个
0
位,对于10..19,编码为
10
,对于20..29,编码为
110
,等等

现在,对于大多数值,您已经将消息大小减少到最大5位,但是您仍然能够在不使用分隔符的情况下毫不含糊地传输所有值

对于较大的值(例如,范围990..999中的值需要100位的商),这是为什么编码对于双面几何分布是最佳的


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

在1上使用游程编码没有意义。想想看:首先需要一点来区分跑步和原始比特,然后需要足够的比特来编码跑步的长度。您可以使用固定数量的位,在这种情况下,您使用的位比不使用任何编码时使用的位要多,或者您可以使用可变长度编码方案。比如。。。。Golomb编码?但是你应该使用不同的M值,或者你可以使用哈夫曼编码,但是为什么不使用哈夫曼编码呢?为什么不使用哈夫曼编码呢?原因有二:哈夫曼需要先传送一整本字典;Golomb Rice仅传输其单个参数的值。此外,Golomb-Rice的实现更简单。Golomb Rice可能也会稍微快一点,因为它不需要内存查找。不过,我还没有对此进行任何基准测试。为了澄清这一点,二进制代码通常意味着固定宽度的二进制代码,这是一种前缀代码,是明确无误的。例如,8位字节最多代表256个值的代码是前缀代码。