【问题标题】:Compression of sequence of integers providing random access提供随机访问的整数序列压缩
【发布时间】:2012-09-20 17:15:36
【问题描述】:

我有一个小范围内的 n 个整数序列[0,k),并且所有整数都具有相同的频率f(因此序列的大小为n=f∗k)。我现在要做的是压缩这个序列,同时提供 随机访问(第 i 个整数是什么)。实现随机访问的时间不一定是 O(1)。我对以更高的随机访问时间为代价实现高压缩更感兴趣。

我没有尝试过霍夫曼编码,因为它根据频率分配代码(而且我所有的频率都是相同的)。对于这种特殊情况,也许我缺少一些简单的编码。

任何帮助或指点将不胜感激。

提前致谢。

PS:已经在 cs.stackexchange 中询问过,但在这里也要求提供更好的覆盖范围,抱歉。

【问题讨论】:

  • 我无法想象如何在压缩它的同时保留保证的 O(1) 随机访问。您是否愿意接受更差的算法性能,而不仅仅是性能为 O(1) 的更差的常数乘数?
  • 如果序列是真正随机的,那么你几乎无法压缩它。您可以为 log2(k) 位的每个整数使用最小大小表示,但除此之外,您将受到熵的支配。
  • @evilotto:整数在[0, k) 范围内,因此它们已经处于最小尺寸表示中。然而,我们并不是在谈论任何想象中的随机序列,因为它们都具有完全相同的频率。
  • 如果k = 256 并且数据是完全随机的,我希望每个都具有(大部分?)相同的频率。给定每个整数 8 位表示,我会说它是不可压缩的,没有其他冗余来源。
  • 所以分布不是随机的(每个数字的频率相同),而是顺序是随机的还是结构化的?例如0 0 0 0 1 1 1 1 2 2 2 2 是可压缩的,但真正随机的重新排列并没有那么多(至少从长远来看)。流中的结构可能会导致更多的压缩,而不仅仅是考虑频率,即使在极其偏斜的分布中也是如此。

标签: algorithm compression


【解决方案1】:

如果所有整数都具有相同的频率,那么最佳压缩的公平近似值将是每个整数 ceil(log2(k)) 位。您可以在恒定时间内访问这些位数组。

如果k 非常小(如 3),则上述方法可能会浪费大量空间。但是,您可以将固定数量的小整数组合成一个 base-k 数字,它可以更有效地适合固定数量的位(您也可以方便地将结果适合标准大小的单词) .无论如何,您也可以在恒定时间内访问此编码。

如果您的整数具有相同的频率,则最佳压缩可能会从输入的不同部分产生可变的比特率,因此简单的数组访问将不起作用。在这种情况下,良好的随机访问性能需要索引结构:将压缩数据分成大小合适的块,每个块都可以按顺序解压缩,但这一次受限于块大小。


如果每个数字的频率完全相同相同,则可以利用这一点节省一些空间——但这可能还不够值得。

n[0,k)范围内的随机数的熵是n log2(k),即log2(k)位/个数;这是编码您的数字所需的位数不利用确切的频率。

f 的可区分排列的熵复制每个k 元素(其中n=f*k)为:

log2( n!/(f!)^k ) = log2(n!) - k * log2(f!)

应用斯特林近似(仅当 nf 很大时才适用),得到:

~ n log2(n) - n log2(e) - k ( f log2(f) - f log2(e) )
= n log2(n) - n log2(e) - n log2(f) + n log2(e)
= n ( log2(n) - log2(f) )
= n log2(n/f)
= n log2(k)

这意味着,如果n 很大而k 很小,您将无法利用输入的精确频率获得大量空间。

上述斯特林近似的总误差为O(log2(n) + k log2(f)),即每个编码数字为O(log2(n)/n + log2(f)/f)。这确实意味着,如果您的k 太大而您的f 很小(即每个不同的数字只有少量副本),您可以通过巧妙的编码节省一些空间。但是,问题指出 k 实际上很小。

【讨论】:

  • 压缩 [0,k) 到 ceil(log2 k) 位范围内的数字将提供相同的“压缩”,而不管数字的频率如何,尽管位域操作有点痛苦.实际上,如果您知道 k 相对于 2^64 较小,您可以通过将 floor(log(k) 2^64) 数字以 64 位整数存储在基数 k 中来更接近最佳压缩。其余的分析是准确的。
  • 最后是我在第二段中尝试的内容。
  • 我已经改进了第三段来解释我在谈论一个不同的案例。
  • +1。顺便说一句,您可以轻松计算理论上的最佳压缩比:(lgamma(f * k + 1) - k * lgamma(f + 1))/(f * k * log(k))。绘图显示回报下降的速度。
  • 您能分享一下您对公式的见解吗? @comingstorm 所以,总而言之,我无法提高每个整数的 log2(k) 位?
【解决方案2】:

如果您计算出可能的不同组合的数量并取其对数基数 2,您可以找到最佳的压缩方式,我认为在您的情况下它不会那么好。对于频率 1 的 16 个数字,可能的消息数是 16! Excel 告诉我以 2 为底,以 16 为底!是 44.25,而将它们存储为 4 位代码只需要 64 位。 (您想要的每种类型不止一种http://mathworld.wolfram.com/MultinomialCoefficient.html

我认为您将随机访问混入其中会遇到问题,因为您拥有的唯一信息是每种类型的元素都有固定数量的元素 - 在整个序列中。对于整个序列来说,这并不是很多信息,而且它几乎没有单独说明序列的前半部分,因为你很可能在前半部分有更多的数字,而在后半部分则更少。

【讨论】:

    猜你喜欢
    • 2012-12-22
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 2020-01-03
    • 2015-05-05
    相关资源
    最近更新 更多