1

我已经对整数的数据序列进行了排序。2 个数字之间的最大差值为 3。因此数据看起来像这样:

Data: 1 2 3 5 7 8 9 10 13 14
Differences: (start 1) 1 1 2 2 1 1 1 3 1

有没有比保存差值更好的方法来存储(压缩)这种类型的序列?因为如果我使用基于字典的方法,由于数字 1,2 和 3 的随机性,它无法压缩。如果我使用“PAQ”样式压缩,结果会更好,但仍然不太令人满意。霍夫曼和算术编码器比基于字典的方法差。

有什么方法可以预测吗?

例如,对原始数据使用回归而不是存储差异(可能更小或更一致)

或者使用某种基于差异直方图的预测?

或者完全不同的东西......或者根本不可能(在我看来,这是真正的答案:))

4

1 回答 1

0

由于您在评论中说您已经在每个字节存储了四个差异,因此您可能不会做得更好。如果差异 0、1、2 和 3 是随机且均匀分布的,那么就没有办法做得更好了。

如果它们分布不均匀,那么使用霍夫曼或算术代码可能会做得更好。例如,如果 1 比 0 更常见,而 0 比 2 和 3 更常见,那么您可以将 1 存储为 0、0 存储为 10、2 存储为 110、3 存储为 111。或者如果 0 从未发生,则将 1 存储为 0、2和 3 作为 10 和 11。对于您引用的 1 出现 80% 的时间的情况,您可以使用算术代码做得更好。或者一个穷人的算术代码,通过编码符号对。例如:

11 0
13 100
21 101
12 110
31 1110
22 111100
23 111101
32 111110
33 111111

将是 1 80%、2 10%、3 10% 的好代码。(这并不能完全处理奇数差异的情况,但您可以在开始时只用一点表示偶数或奇数,如果奇数在最后再增加几位。)

可能有比之前的值更好的预测器。这将是n 个先前值的函数,而不仅仅是一个先前值。然而,这将高度依赖数据。例如,您可以假设当前值可能落在前两个值所形成的线上。或者它落在前面三个值所形成的抛物线上。或者一些其他函数,例如具有某种频率的正弦曲线,如果数据如此有偏差的话。

于 2013-02-14T17:30:07.547 回答