我有一个数组,其中包含-255到+ 255.e.g范围内的数据。数组可以是这样的:
int data[]={234,56,-4,24,56,78,23,89,234,68,-12,-253,45,128};
这里,必须保留顺序,同时解压缩,例如在第一学期234之后,56必须来。
那么,有哪些方法可以压缩任何无法观察到任何重复模式的任意数字序列?
答案 0 :(得分:5)
-255到255的范围意味着511个值 - > 9位。如果单独使用符号,则1位用于符号,1位用于值。
您可以将数组编写为字节数组,每个字节值将是相关int的绝对值。
在单独的区域(长或可能是字节数组)中,存储符号位。
答案 1 :(得分:5)
如果数据中确实没有模式,则无法使用有用的压缩算法。甚至不打扰尝试!
当然,在这种情况下,因为所有数字都在一个受限制的范围内,所以你确实在这些位中有一个模式 - 即你的高位全部为0(正)或全1(负)。
如果您想要合理有效地压缩(假设您有足够长的数字数组以使其值得),则像zip这样的标准压缩算法会起作用。
或者,您可以利用有效使用9位数的事实。因此,您可以通过将数字布置为9位块的长流并将其放入字节数组来推广自己的压缩算法。
答案 2 :(得分:4)
在您的情况下(无法观察重复模式时),可变长度编码可能会对您有所帮助。
例如,Elias gamma-coding和Exponential-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位编码。强>
解码过程的简短描述:
从输入流中读取并计算前导零位(直到找到非零值) 位) - >的 zero_bits_count 强>
从输入流中读取下一个(zero_bits_count + 1)位 - >的二进制强>
将二进制转换为十进制
返回(小数 - 1)
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。这很方便,因为您可以将其用作结束符号来标记列表的结尾。然后你还编写了列表的长度,无论如何都需要它。