2010-06-29 1 views
5

Я хотел бы знать, что такое использование памяти BitSet в Scala.For Например, если я делаю:BitSet использование памяти в 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 \ [\] против BitSet: что более эффективно?] (Http://stackoverflow.com/questions/605226/boolean-vs-bitset-which-is-more-efficient) –

+3

Возможно, вы должны дать нам более сложную формулировку проблемы, которую вы пытаетесь решить, вместо трех вариантов вопросов о свойствах структуры данных низкого уровня. –

+0

Спасибо Томасу, этот пост дал мне больше информации о BitSet. Я все еще хочу знать, могу ли я получить пространство, представляя другие структуры BitSet. Я думаю, что когда-нибудь будет яснее, если кто-то сможет прояснить, как реализован BitSet. Спасибо, – Skuge

ответ

16

Вы можете посмотреть на реализацию BitSet в Scala 2.8 здесь: scala.collection.mutable.BitSet.

Он реализован на основе массива Longs. Размер массива зависит только от наивысшего числа, хранящегося в нем. Разделите наибольшее число, сохраненное в нем на 64, округляя вверх, и размер массива будет равен. Каждый элемент массива потребляет 8 байтов.

Это означает, что деление на 8 наибольшее количество, хранящееся в нем, примерно дает размер в байтах BitSet. «Грубо» из-за накладных расходов на управление памятью виртуальной машины, поскольку указатель на массив также нуждается в некоторой памяти и потому, что сам массив имеет некоторые накладные расходы.

Порядок вставки или фактическое количество элементов, хранящихся в БитСети, не влияют на размер выделенной памяти.

Для двух примеров, которые вы даете, только один Long-элемент необходим для хранения чисел, используя 8 байт памяти, так как в обоих примерах наибольшее число меньше 64.

Массив Ints, сохраняя любые пять чисел, будет потреблять 5 * 4 байта = 20 байт плюс накладные расходы. Для хранения n номеров вам потребуется примерно n * 4 байта.

Итак, вы сравниваете (наивысшее количество единиц измерения/8) байтов с байтами (countOfNumbersStored * 4).

 Смежные вопросы

  • Нет связанных вопросов^_^