2010-06-29 57 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)字節。