我必须压缩一组包含9个16位有符号整数的8个列表,例如:
a = [1 2 3 4 5 6 7 8 9]
b = [10 11 12 13 14 15 16 17 18]
c = [19 20 21 22 23 24 25 26 27]
d = [28 29 30 31 32 33 34 35 36 37 38]
e = ...
我们无法控制数字来源,但我做了一些分析,我们发现通常12-18%的数字是0,而85-90%的数字可以用4位表示或更少。大约99%可以用8位表示。数字平均分布在0左右。
数据将被打包成一个共享的固定大小结构,这意味着最终我们将拥有
的sizeof(a_compressed)==的sizeof(b_compressed)==的sizeof(c_compressed)==的sizeof(d_compressed)= ...
使最坏的情况占主导地位
每个列表必须独立于其他列表(例如,我不需要访问a以便读取b)但是它们可以(可选地)在独立的共享数据结构x中共享额外信息。
压缩的计算成本无关紧要。对于解压缩,它不是一个关键参数,但是如果不是必须读取整个列表以便解压缩它将是值得赞赏的。已知数据访问是顺序的(我们将读取c [0],然后是c [1],c [2] ...)
到目前为止,我用这个算法获得了最好的结果: - 寻找4个阵列的最高绝对值 - 获取表示它所需的位数 - 使用此位精度对所有数字进行编码 - 存储连续解压缩的位精度
结果,我们在53.5位/列表
的数据集中得到了最坏的情况我希望我提供了足够的信息......谢谢!