2010-06-29 86 views
2

应该很简单。单色位图

我正在尝试处理长序列的二进制数据的斯卡拉。这是很长的0和1的列表。什么是存储/访问这种数据的“最佳”方式?

这里的重点是内存优化,所以我想避免使用整个字节来存储布尔值。访问也很重要,所以我想避免将它们分成几个字节然后放到数组中。

BitMap是一个好主意吗? scala中有这样的一个类吗?

如果没有,最好是使用ByteArray?你将如何实现这一点?

还有其他想法吗?

感谢,

回答

2

您可以使用java.util.BitSet中的(也许是一对夫妇,如果巧妙清楚地表达,使其更斯卡拉类)。

如果仍然过于昂贵,我会写一个内部使用数组的类,并将这些位打包成int或字节。

+0

太棒了!我发现Scala也有一个BitSet(http://www.scala-lang.org/docu/files/api/scala/collection/BitSet.html)。唯一的问题是尺寸可能太小(由Int指示)。 谢谢, – Skuge 2010-06-29 11:54:16

2

如果你的值不是均匀分布的(显着多于0),你可以使用run-length encoding来编码图像数据。这是Fax使用的编码。

有两种编码选项:

  • 使用RLE黑白
  • 只使用RLE一种颜色,如果你编码其它颜色(或混合路段)
使用直接编码
+0

好主意,但我正在寻找数据结构,我可以存储这些信息。 如果你做了游程编码,你会使用Int列表吗?由于ints长度为32位,因此您需要非常特殊的分布才能获得良好的压缩效果(就像您说的,一张纸是大型空白区域的一个很好的例子) – Skuge 2010-06-29 12:09:57

+0

如果您编码可以编码的字节,Int可能会被浪费2^7的长度为黑色或白色节省1位。 – 2010-06-29 12:17:27