我有一个向量,我在其中保存一个递增的数据。通常,向量的每个元素都是一个 64 位长的变量。但是,两个连续元素之间的差异很可能非常小,因此例如我们可以有一个如下的序列。
1, 34, 37, 42, 45, 1098, 1200, 1211, 1938
压缩此数据的最佳方法是什么。只保留差异是否理想,并有一个标题字节来定义差异有多大,无论它只是一个字节、字、双字等,还是有更好的方法来压缩这种增量数据?
编辑
我需要在线压缩,即同时将数据放入向量中。您可以假设一个动态扩展的向量。
我有一个向量,我在其中保存一个递增的数据。通常,向量的每个元素都是一个 64 位长的变量。但是,两个连续元素之间的差异很可能非常小,因此例如我们可以有一个如下的序列。
1, 34, 37, 42, 45, 1098, 1200, 1211, 1938
压缩此数据的最佳方法是什么。只保留差异是否理想,并有一个标题字节来定义差异有多大,无论它只是一个字节、字、双字等,还是有更好的方法来压缩这种增量数据?
我需要在线压缩,即同时将数据放入向量中。您可以假设一个动态扩展的向量。
当增量通常很小时,这是一个非常简单的策略:
如果增量<2**7,则将其作为最高位设置为零的单个字节发出:
0xxxxxxx
否则,如果增量 <2**14,则将其作为两个字节发出,最高位分别为 1 和 0:
1xxxxxxx 0xxxxxxx
以明显的方式将其扩展到更大的增量。第八位设置为 1 表示“等待,还有更多”。零表示“整数结束”。
我记得在某些 RFC 或 RFC 中看到为 bigints 建议了这种编码方案internet-draft
,但我现在似乎无法检索它。或者,您可以重用 UTF-8 编码方案来改进错误检测,但代价是编码效率较低(如果您想超越 64 位整数,您可能必须对其进行扩展)。
听起来你需要一些东西(正如你自己已经说过的那样),比如差分调制。也许这会给你一些灵感:http ://en.wikipedia.org/wiki/Differential_pulse-code_modulation