Arrays 我怎样才能最好地压缩部分排序的50000字节

Arrays 我怎样才能最好地压缩部分排序的50000字节,arrays,algorithm,sorting,math,compression,Arrays,Algorithm,Sorting,Math,Compression,我想压缩尽可能多的50000字节,这是部分排序 这意味着有256个字节在增加,比如0,0,3,4,5,6,6,9,…,250个 此外,还存在约6300000000的反向。我已经使用bubblesort计算了反演,并计算了递减对 每个字节通常相等 行程长度相差20% 目前我使用deltacompression进行运行,使用huffman进行编码,得到约14000字节。如何进一步压缩它 示例链接: 列表中以逗号分隔的文件字节。没有编码。简而言之,您已经非常接近理论极限。除非你有一些关于这

我想压缩尽可能多的50000字节,这是部分排序

  • 这意味着有256个字节在增加,比如
    0,0,3,4,5,6,6,9,…,250个

  • 此外,还存在约6300000000的反向。我已经使用bubblesort计算了反演,并计算了递减对

  • 每个字节通常相等

  • 行程长度相差20%

目前我使用deltacompression进行运行,使用huffman进行编码,得到约14000字节。如何进一步压缩它

示例链接:
列表中以逗号分隔的文件字节。没有编码。

简而言之,您已经非常接近理论极限。除非你有一些关于这些序列的信息没有和我们分享,否则你不会做得更好。如果说“好得多”,你不可能达到14公里,更不用说10公里了

让我们先看看有多少这样的序列

我们可以将您的序列转换为0-65535范围内的非递减序列,方法是在每个序列中添加256倍的已完成运行数。也就是说,你不需要“绕圈子”,而是继续攀爬。这是一个一对一的对应关系,尽管不可否认,一些(实际上很多)递增序列将不会与您希望编码的序列对应。请注意这个事实,我稍后会再谈这个问题

在0-65535范围内有多少长度为50000的非递减序列?这些序列与115535位的序列一一对应,其中50000位为零。对应关系是用一个计数替换每一个0位,在它之前发生了多少个1位,以从序列中得到数字

115535位(其中50000位为零)的序列数为115535-50000。这是
115535!/(50000!*65535!)
。这是一个相当大的数字,但是我们可以使用斯特林公式来估计它的对数,
logu2(n!)=nlogu2(n)-n*logu2(e)+logu2(pi*n/2)+O(logn))
。为此目的:

log_2(115535) = 16.8179704401675
log_2(65535) = 15.9999779860527
log_2(50000) = 15.6096404744368
log_2(pi * 115535 / 2) = 17.4694665696399
log_2(pi * 65535 / 2) = 16.6514741155252
log_2(pi * 50000 / 2) = 16.2611366039092
log_2(e) = 1.44269504088896
现在,请仔细检查计算错误

log_2(115535 choose 50000)
    = log_2(115535!) - log_2(65535!) - log_2(50000!)
    = 115535 * log_2(115535) - 115535 * log_2(e) + log_2(pi * 115535 / 2) + O(log(115535))
      - (65535 * log_2(65535) - 65535 * log_2(e) + log_2(pi * 65535 / 2) + O(log(65535)))
      - (50000 * log_2(50000) - 50000 * log_2(e) + log_2(pi * 50000 / 2) + O(log(50000)))
    = 115535 * 16.8179704401675 - 115535 * 1.44269504088896 + 17.4694665696399 + O(log(115535))
      - (65535 * 15.9999779860527 - 65535 * 1.44269504088896 + 16.6514741155252 + O(log(115535)))
      - (50000 * 15.6096404744368 - 50000 * 1.44269504088896 + 16.2611366039092 + O(log(115535)))
    = 1776399.91272222 - 954028.189285421 - 708363.532813996 + O(16.8179704401675)
    = 114008.190622803 + O(16.8179704401675)
如果您想扩展斯特林级数的几个项,您会发现114008.190622803与真实对数的偏差小于1

因此,您需要大约114008位来指定一个这样的序列,这需要14251字节。这意味着如果你想把它压缩到14k范围,你已经非常接近理论极限了。除非你有比你提供的更多的关于序列的信息,否则你不会做得更好

但我在作弊。您指定运行的长度变化不超过20%。我包括那些跑步的长度不仅不同,甚至有些跑步可以完全跳过的地方!这有什么大不了的


根据我刚刚做的模拟,50%以上的时间里,跑步距离中位数的10%以内。我们有256次跑步。它们的长度实际上不是独立的,但长距离与短距离相关,反之亦然,因此,如果赔率大于1/2^256,我们将随机满足长度要求。这意味着长度条件节省的理论最佳值不超过32字节。考虑到我们已经讨论了大约14k的数据,这并不是一个显著的改进。

评论不用于扩展讨论;这段对话已经结束。