c++ - 更好的 vector 数据压缩算法?

标签 c++ compression

我需要压缩一些空间相关的数据记录。目前我使用 zlib 获得 1.2x-1.5x 压缩,但我认为应该有可能获得更接近 2x 的压缩。数据记录有各种字段,但例如,zlib 似乎无法压缩点列表。

这些点代表道路网络。它们是 XXXXYYYY 形式的定点 4 字节整数对。通常,如果单个数据 block 有 100 个点,则 X 和 Y 的前两个字节(空间相关)的组合只会很少。但是底部字节总是在变化,并且对于 zlib 来说必须看起来像随机数据。

同样,记录具有 4 字节 ID,往往具有恒定的高字节和可变的低字节。

是否有另一种算法能够更好地压缩这种数据?我正在使用 C++。

编辑:请不要再提出更改数据本身的建议。我的问题是关于自动压缩算法。如果有人链接到所有流行压缩算法的概述,我会接受它作为答案。

最佳答案

如果您尝试根据您对数据结构的了解自行压缩数据,您可能会获得更好的结果。

通用压缩算法只是将您的数据视为比特流。他们寻找常用的位序列,并用较短的字典索引替换它们。

但是重复数据并没有消失。重复的序列变短了,但它仍然像以前一样经常重复。

据我了解,你有大量表格的数据点

XXxxYYyy,其中大写字母非常统一。所以将它们排除在外。

将列表重写为类似于此的内容:

XXYY // a header describing the common first and third byte for all the subsequent entries
xxyy // the remaining bytes, which vary
xxyy
xxyy
xxyy
...
XXYY // next unique combination of 1st and 3rd byte)
xxyy
xxyy
...

现在,很少变化的字节的每个组合只列出一次,而不是为它们出现的每个条目重复。这加起来显着节省了空间。

基本上,在通过 zlib 运行它之前,尝试自己删除重复数据。您可以做得更好,因为您对数据有更多的了解。

另一种方法可能是,不是将这些坐标存储为绝对数字,而是将它们写为增量,与选择的某个位置的相对偏差尽可能接近所有条目。您的增量将是更小的数字,可以使用更少的位来存储。

关于c++ - 更好的 vector 数据压缩算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3118600/

相关文章:

c++ - 使用计数器模式用 SHA256 加密数据是否聪明?

C++ 编码逻辑 - 各种想法

c++ - 以图形化的方式编写 C++?

swift - 将视频从 UIPickerViewController 压缩到以 MB 为单位的特定大小,以便在 Swift 2 中联网

ios - iOS 是否支持 TLS 压缩?

c - 编程新手 : How to program my own data compression algorithm?

c++ - 在 C++ 类中使用线程的段错误

c++ - 减少 wiimote 俯仰/滚动变化

c# - 使用c#模拟mysql压缩功能

c# - 重复的文本查找