如何压缩整数序列?

时间:2012-09-01 11:11:32

标签: java arrays multidimensional-array arraylist compression

我有一个数组,其中包含-255到+ 255.e.g范围内的数据。数组可以是这样的:

  int data[]={234,56,-4,24,56,78,23,89,234,68,-12,-253,45,128};

这里,必须保留顺序,同时解压缩,例如在第一学期234之后,56必须来。

那么,有哪些方法可以压缩任何无法观察到任何重复模式的任意数字序列?

4 个答案:

答案 0 :(得分:5)

-255到255的范围意味着511个值 - > 9位。如果单独使用符号,则1位用于符号,1位用于值。

您可以将数组编写为字节数组,每个字节值将是相关int的绝对值。

在单独的区域(长或可能是字节数组)中,存储符号位。

答案 1 :(得分:5)

如果数据中确实没有模式,则无法使用有用的压缩算法。甚至不打扰尝试!

当然,在这种情况下,因为所有数字都在一个受限制的范围内,所以你确实在这些位中有一个模式 - 即你的高位全部为0(正)或全1(负)。

如果您想要合理有效地压缩(假设您有足够长的数字数组以使其值得),则像zip这样的标准压缩算法会起作用。

或者,您可以利用有效使用9位数的事实。因此,您可以通过将数字布置为9位块的长流并将其放入字节数组来推广自己的压缩算法。

答案 2 :(得分:4)

在您的情况下(无法观察重复模式时),可变长度编码可能会对您有所帮助。

例如,Elias gamma-codingExponential-Golomb coding一般的想法 - 小数字只需要很少的位进行编码。 Exp-Golomb编码用于H.264 / MPEG-4 AVC视频压缩标准。用它编码和解码序列非常容易,实现这种编码也不是很难。

编码所有整数的方法是设置一个双射,将整数(0,1,-1,2,-2,3,-3,...)映射到(1,2,3,4, 5,6,7,...)编码之前。

例如:

序列(在双射后)[ 0, 2, 5, 8, 5, 2 ]将被编码为101100110000100100110011 - 正如您所看到的 - 此序列中没有重复模式,但它仅以24位编码。

解码过程的简短描述:

  1. 从输入流中读取并计算前导零位(直到找到非零值) 位) - >的 zero_bits_count

  2. 从输入流中读取下一个(zero_bits_count + 1)位 - >的二进制

  3. 二进制转换为十进制

  4. 返回(小数 - 1)

  5. 1... -> no leading zeros, zero_bits_count = 0 -> read next 1 bit -> [1]... -> [1] is 1 -> 1 - 1 = 0

    011... -> [0] - one leading zero, zero_bits_count = 1 -> read next 2 bits -> [11]... -> [11] is 3 -> 3 - 1 = 2

    00110... -> [00] - two leading zeros, zero_bits_count = 2 -> read next 3 bits -> [110]... -> [110] is 6 -> 6 - 1 = 5

答案 3 :(得分:1)

如果数字基本上是随机且均匀分布的,并且要保留顺序,那么您可以做的最好是每个符号大约9位。在9位时,将使用单个9位值,即2的补码表示中的-256。这很方便,因为您可以将其用作结束符号来标记列表的结尾。然后你还编写了列表的长度,无论如何都需要它。