我有一组存储在数组中的二维点。我需要尽可能地压缩它。最好是快速压缩,但不是必须的,压缩率是目标。规则如下:
- 一个点 = 一个32位结构体,存储为(x,y),每个坐标2字节。 - 一个坐标 = 一个"float",有8位整数部分和8位小数部分。
特殊属性:
- 我可以根据需要更改点的顺序。 - 我按照它们的x和y的整数部分的顺序给出点,也许我可以利用这一点,但从我看到的情况来看,小数部分几乎是随机的。 - 我收到的数组是连续的(从内存的角度来看)。
我目前的研究:
数据集示例,以十六进制表示:
- 一个点 = 一个32位结构体,存储为(x,y),每个坐标2字节。 - 一个坐标 = 一个"float",有8位整数部分和8位小数部分。
特殊属性:
- 我可以根据需要更改点的顺序。 - 我按照它们的x和y的整数部分的顺序给出点,也许我可以利用这一点,但从我看到的情况来看,小数部分几乎是随机的。 - 我收到的数组是连续的(从内存的角度来看)。
我目前的研究:
- 将它们视为普通整数(32位),对它们进行排序(顺序由我选择),然后像this question中那样进行压缩。
- 将我的数组视为普通字符字符串,然后应用Burrows-Wheeler变换(BWT)与run-length编码或Huffman。
- 将我的数组视为普通二进制数据,然后应用LZW。
我只能实现Huffman和BWT,但它们都没有给我一个好的压缩比率(或使用我的数据集的主要属性)。今天我将尝试第一种选项。
我很确定有更好的想法。你有吗?你是否遇到过类似的情况并实现了一些非常好的东西?数据集示例,以十六进制表示:
00 0A 00 77 00 55 00 80 00 2B 00 B9 00 7A 00 5B
00 F6 00 76 00 B4 00 25 00 47 00 D3 00 F6 00 7D
...
01 05 00 A9 01 B8 00 10 01 4F 00 6A 01 E6 00 DF
01 1F 00 F0 01 BE 00 C3 01 6C 00 87 01 CE 00 44
...
...
15 06 03 F4 15 1E 03 29 15 35 03 10 15 B9 03 22
15 67 03 73 15 EF 03 5C 15 29 03 B8 15 4C 03 2F
...
例如,粒子15 67 03 73
(最后一行)表示位于x = 15和67/256,y = 3和73/256的粒子。正如您所看到的,数据有些有序,但小数部分却是完全混乱的。