【问题标题】:Best way to represent numbers of unbounded length?表示无限长度数字的最佳方法?
【发布时间】:2013-04-16 04:37:07
【问题描述】:

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

(数字范围从零到正无穷

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

有没有专门用于压缩数字的压缩算法

【问题讨论】:

  • 是的,就是身份功能。它提供随机序列的最佳压缩,即 1:1。
  • @rici 身份功能是什么意思?
  • 返回其参数而不进行转换的函数。关于(无法)压缩随机数据的常见问题解答:faqs.org/faqs/compression-faq/part1/section-8.html,将其与永动机进行比较。
  • 如果数据真的是随机的,那么平均就不可能变小。见information theory
  • @MarkRansom 仅供参考,所有随机分布都可以压缩到它们的熵。有非常少数 种情况无法压缩(AKA 均匀分布)。我确实明白你在说什么。 OP没有定义他的数字分布。所以我们可以假设它是一个均匀分布(从 0 到无穷大,这是一个非常“不方便”的分布),我们永远无法压缩它。如果这些数字来自我们可以压缩的泊松分布。

标签: algorithm language-agnostic numbers compression


【解决方案1】:

对于可变长度整数,您基本上有两种选择:

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

    您本身无法压缩,但您可以编码,这可能是您正在寻找的。您的文件包含由换行符分隔的 ASCII 十进制数字序列。您应该简单地对字符进行 Huffman 编码。你不会比每个字符大约 3.5 位做得更好。

    【讨论】:

      猜你喜欢
      • 2013-03-10
      • 1970-01-01
      • 2014-11-15
      • 2016-02-26
      • 2011-12-11
      • 1970-01-01
      • 2021-11-11
      • 2011-03-18
      • 1970-01-01
      相关资源
      最近更新 更多