表示无限长度数的最佳方法?

时间:2013-04-16 04:37:07

标签: algorithm language-agnostic numbers compression

表示无界长度整数的最佳(节省空间)方式是什么?

(数字范围从零到正无穷大

可以找到一些样本号输入here(每个号码都显示在它自己的行上)。

是否有专门压缩数字的压缩算法

2 个答案:

答案 0 :(得分:3)

你基本上有两种可变长度整数的替代方案:

  1. 使用每个k的1位作为结束终止符。例如,谷歌protobuf就是这样做的(在他们的例子中,每个字节都有一位,所以每个字节有7个有用的位)。

  2. 首先输出位长,然后输出位。这就是ASN.1的工作原理,除了以表格1表示的OID。

  3. 如果数字可能非常大,则选项2更好,虽然它更复杂并且您必须递归地应用它,因为您可能必须输出长度的长度,然后输出长度,然后输出数字。一种常见的技术是对长度字段使用选项1(位标记)。

    对于较小的数字,选项1更好。考虑大多数数字适合64位的情况。每字节存储7位的开销是1/7;有八个字节,你代表56位。使用甚至长度的7/8表示也将表示八个字节中的56位:一个长度字节和七个数据字节。任何短于48位的数字都将受益于自终止代码。

    无限长度的“真正随机数”平均来说是无限长的,所以这可能不是你所拥有的。更有可能的是,您对数字大小的概率分布有所了解,并可以在上述选项之间进行选择。

    请注意,这些“压缩”都没有(除了相对于臃肿的ascii-decimal格式)。 log n/n的渐近线为0,因此数字越大,数字大小的大小往往不占用(相对)空间。但它仍然需要以某种方式表示,因此总表示将总是比数字的log 2 大一点。

答案 1 :(得分:0)

你不能压缩本身,但你可以编码,这可能是你正在寻找的。您有由换行符分隔的ASCII十进制数字序列的文件。你应该只是霍夫曼编码字符。你不会做得比每个字符大约3.5位更好。