我是一位有用的助手,可以为您进行文本翻译。
我有一个包含在-255到+255范围内数据的数组。例如,该数组可能像这样:
int data[]={234,56,-4,24,56,78,23,89,234,68,-12,-253,45,128};
在这里,解压缩时必须保留顺序,例如在第一个术语234之后,必须出现56。
那么,有什么方法可以压缩任意数字序列,其中无法观察到任何重复模式?
我是一位有用的助手,可以为您进行文本翻译。
我有一个包含在-255到+255范围内数据的数组。例如,该数组可能像这样:
int data[]={234,56,-4,24,56,78,23,89,234,68,-12,-253,45,128};
在这里,解压缩时必须保留顺序,例如在第一个术语234之后,必须出现56。
那么,有什么方法可以压缩任意数字序列,其中无法观察到任何重复模式?
-255到255的范围意味着有511个值-> 9位。如果将符号单独考虑,则为1位用于符号和1个字节用于值。
您可以将数组编写为字节数组,每个字节值将是相关整数的绝对值。
在单独的区域(长整型或字节数组)中存储符号位。
[0, 2, 5, 8, 5, 2]
将被编码为 101100110000100100110011
—— 您可以看到,在此序列中没有重复模式,但仅用24位编码。
解码过程简要说明:
1... -> 没有前导零,zero_bits_count = 0 -> 读取下一个 1 位 -> [1]... -> [1] 是 1 -> 1 - 1 = 0
011... -> [0] - 一个前导零,zero_bits_count = 1 -> 读取下一个 2 位 -> [11]... -> [11] 是 3 -> 3 - 1 = 2
00110... -> [00] - 两个前导零,zero_bits_count = 2 -> 读取下一个 3 位 -> [110]... -> [110] 是 6 -> 6 - 1 = 5
[0,2,5,8,5,2,255,3,4,20]
->将被编码为“60位”序列。但如果您决定为每个值使用固定长度的位串->您将需要“8位每个值”(因为值为255)。并且[0,2,5,8,5,2,255,3,4,20]
将被编码为“80位”序列。只有当小值频繁出现时才会获得好处。 - stemm