特定长数组的压缩可能性

时间:2018-03-10 18:46:42

标签: compression

我有一个文件,它只是一个长数组(8字节整数)。 我知道每个连续的长期值都比它的前任更大。

有哪些简单而复杂的方法来压缩这些数据?

我的想法:

评估最大差异并仅存储长度之间的差异,假设每个长度需要较少的比特来表示差异。

欢迎任何建议。

1 个答案:

答案 0 :(得分:0)

总的来说,你的想法似乎是正确的。

假设您有L 0 .. L 1 ... L n-1 .. L n 你的n个无符号长号,例如 L k + 1 > = L k ,显然根据定义L 0 > = 0和L k < = L max

让我们调用diff k = L k + 1 - L k 表示您计划压缩的数据的差函数。

如果我们研究diff 0 的总和.. diff 1 ... diff n-2 .. diff n -1

diff 0 + diff 1 + .. + diff n-2 + diff n-1 = L 1 - L 0 + L 2 - L 1 + .. + L n-1 - L n-2 + L n - L n-1

这简化为L n - L 0 :所有差异的总和等于L n - L 0 < /子>

因此平均而言,函数diff n 的值为(L n - L 0 )/(n - 1),而L k 的平均值为(L n - L 0 )/ 2.

as n&gt;&gt;因此,我们可以说平均值(diff n )&lt;&lt;平均值(L n ),这意味着需要更少的位来压缩diff n 信息。

至于如何进行这样的压缩,如果没有关于数据分布的更多信息,很难评估最佳算法可能是什么。 你可以从这样一个简单的方案开始:

if(diff k &lt; 128)返回一个第一位设置的字节,其余7位包含diff k 的值 否则if(diff k &lt; 16384)返回一个第一位未设置的字节,其余7位包含diff k 值的前7位,则另一个字节,第一位设置,剩下的7位包含diff k 等值的其余部分...

要解压缩它很容易,你读取一个字节,如果第一位置位,你知道你只需要读取接下来的7位,如果没有,你读取并存储7位然后继续下一个字节等等。