2010-06-29 65 views
5

我想知道什么是位集合的Scala.For例如内存使用,如果我这样做:位集合的内存使用Scala的

var bitArray:BitSet=new BitSet(10) 
    bitArray.add(0) 
    bitArray.add(2) 
    bitArray.add(4) 
    bitArray.add(6) 
    bitArray.add(8) 

那如何用含偶数0阵列相比, 2,4,6,8?

什么二进制写一个数字:

var bitArray:BitSet=new BitSet(32) 
    bitArray.add(5) 
    bitArray.add(3) 
    bitArray.add(2) 
    bitArray.add(1) 
    bitArray.add(0) 

那如何比较数47?

我在这里问内存使用情况。但是作为一个更开放的问题,如果你知道,BitSet的优点/缺点或用途是什么(WR适用于其他常见数据类型)。

感谢,

+0

[Boolean \ [\] vs BitSet:哪种效率更高?](http://stackoverflow.com/questions/605226/boolean-vs-bitset-which-is-more-efficient) – 2010-06-29 13:29:33

+3

也许你应该给我们一个关于你想要解决的问题的更高层次的陈述,而不是关于非常低层次的数据结构属性的三个变体问题。 – 2010-06-29 13:49:07

+0

谢谢托马斯,那篇文章让我更加了解BitSet。我仍然想知道是否可以通过BitSet表示其他结构来获得空间。 我想如果有人能够阐明BitSet是如何实现的,那么我认为永恒将会变得更加清晰。 谢谢, – Skuge 2010-06-29 14:13:19

回答

16

你可以看一下位集合的斯卡拉2.8这里的实现:scala.collection.mutable.BitSet

它是基于一个Long数组实现的。数组的大小仅取决于存储在其中的最大数字。将存储在其中的最大数字除以64,向上舍入,并且您具有数组的大小。数组中的每个元素都消耗8个字节。

这意味着除以8中存储的最大数字,大致产生BitSet的字节大小。由于虚拟机内存管理的开销,“粗略”,因为指向数组的指针也需要一些内存,因为数组本身有一些开销。

存储在BitSet中的插入顺序或实际元素数量对分配的内存大小没有影响。

对于两个例子你给,仅需要一个长元件来存储数字,使用8个字节的存储器,如在这两个例子中的最高数量小于64

整数数组,存储任何五个数字,将消耗5 * 4字节= 20字节加开销。为了存储n个数字,你需要大约n * 4个字节。

因此,您正在比较(highestNumberStored/8)字节和(countOfNumbersStored * 4)字节。