我正在寻找一种压缩算法:
- 必须不输
- 必须具有非常高的压缩比
- 必须通过 JavaScript 库在浏览器中支持或本机支持
- 不应该很快。
目标:
- 压缩 800 万个双精度浮点数的密集数组。只有 256 个唯一值。值呈正态分布。(主要用例(
- 与以前相同,但对于稀疏数组(包含大量 0 值(
我可以在这些用例中使用 2 种不同的算法。
我找到了谷歌的Brotli算法。但我不确定它是否是最好的。
是一个问题:你的主要任务将是建模(从float number
和lossless
开始(。
[primarily dense arrays] of 256 unique float numbers
听起来并不乐观:根据范围,指数表示可能是可利用冗余的唯一来源。
sparse array
听起来确实很有希望,16×16 稀疏矩阵更是如此。您对数据了解得越多,就越能帮助压缩机——"主要是对角矩阵",有人吗?
"通用数据压缩器"利用自相似性:
要了解您的数据在哪里,请在您选择的任何"机器表示"和通用 unicode 表示上使用"通常的嫌疑人"。
后者允许您使用不超过要求的分辨率。
我有很多浮点数。但是因为只有 256 个唯一值,我可以将每个数字编码为 1 个字节。它提供了巨大的压缩比。之后,我可以运行一些通用算法来进一步压缩数据。我检查了几种流行的算法:gzip,Brotli,bzip2,lzma,Zstandard。
我发现 2 个选项适合我的需求:
- bzip2
- 布罗特利
bzip2:
- 即使我不将浮点数转换为无符号字节,也可以很好地压缩。
- 但需要浏览器中的JS库
布罗特利:
- 仅当我之前手动将所有浮点数映射到无符号字节时,才能很好地压缩
- 几乎所有现代浏览器都原生支持