我在Scala上工作,很大的清单 int (也许 大的)我需要压缩它们并将其保存在内存中。

唯一的要求是,我可以将列表中的第一个数字拉动(和解压缩)触摸列表的其余部分。

我有很多好主意,但其中大多数将数字转化为位。例子:

你可以写任何数字 X 作为元组| log(x)|,x- | log(x)|我们的第一个元素是将其作为1的字符串和0的字符串(Unary Code),第二个元素在二进制中。例如:

1 -> 0,1 -> 0 1

...

5 -> 2,1 -> 110 01

...

8 -> 3,0 -> 1110 000

9 -> 3,1 -> 1110 001

...

int采用固定的32位内存和长64位,但具有此压缩 X 需要 2log(x) 存储的位,可以无限期地生长。在大多数情况下,这种压缩确实会降低。

您将如何处理这种类型的数据?有诸如bitarray之类的东西吗?

有其他方法可以在Scala中压缩此类数据吗?

谢谢

有帮助吗?

解决方案

根据数据集的稀疏性和范围,您可以将数据保留为Deltas的列表,而不是数字。例如,这是用于声音压缩的,并且根据您的需求,可能是有损或无损的。

例如,如果您有 Int 数字,但知道它们几乎不会超过一个(签名) Byte 除了,您可以执行此类字节列表:

-1           // Use -1 to imply the next number cannot be computed as a byte delta
0, 0, 4, 0   // 1024 encoded as bytes
1            // 1025 as a delta
-5           // 1020 as a delta
-1           // Next number can't be computed as a byte delta
0, 0, -1, -1 // 65535 encoded as bytes -- -1 doesn't have special meaning here
10           // 65545 as a delta

因此,您不必使用此特定编码来处理位。但是,实际上,如果没有非常清楚地表明特定问题,数据的特征等,您将无法获得良好的答案。

重读您的问题,看来您不是 丢弃 将数据变成位的压缩技术。如果没有,那么我建议霍夫曼 - 如果需要的话,或者是lempel-Ziv家族的东西。

而且,不,不幸的是,Scala没有库来处理二进制数据。尽管Paulp本身可能有类似的东西。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top