【发布时间】:2021-09-20 14:36:41
【问题描述】:
想象一百万个或更多数据重叠的数组(有时更多有时更少)。数据始终按升序排序。单个值占 2 个字节。
这里有一些例子:
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 5]
[1, 2, 3]
[1, 2, 3, 4]
[2, 3, 4, 5]
我想可以执行某种替换:
A = [1, 2, 3]
[0, A, 4]
[0, A, 5]
[A]
[A, 4]
[2, 3, 4, 5]
这应该已经有很大帮助了,但也许换个不同的替换可以节省更多?当然,行程编码也是一种选择,尽管由于大量冗余信息,替代方法可能会产生更好的压缩。
附加要求:
- 无损压缩
- 解码/解压缩应该很快
- 编码/压缩应该很快(尽管解码/解压缩速度更重要)
- 数据的随机访问
这样的算法看起来如何?有更好的想法吗?真正的问题在于如何以一种占用最少空间同时仍然随时可用的方式存储数据。
编辑: 这些数字并不总是连续的。它可能看起来像这样:
[0, 1, 7, 12, 13, 15]
然而,数据不是随机的,而是显示重复序列。
【问题讨论】:
-
数字总是连续的吗?
-
没有。可以有 [0, 1, 7, 12, 13, 15] 之类的间隙
-
您需要决定要支持的阵列数量。如果它是一百万(大约 2^20),使用 A、B、... 不会削减它。您是否尝试过仅使用 ZIP 压缩,IIRC,它非常擅长处理运行
-
我没有,因为我仍然需要允许随机访问。虽然也许值得将数据分块(但也会再次降低压缩率)。
标签: c# arrays algorithm compression lossless-compression