Очень Компактный Bitarray в Java

Я ищу очень компактный способ сохранить плотную переменную длину bitarray в Java. Прямо сейчас я использую BitSet, но это, кажется, использует в среднем 1.5*n биты пространства памяти некоторое время вектор размера n. Как правило, это не проблема, но в этом случае bitarrays быть сохраненным является довольно значительной частью объем потребляемой памяти приложения. Так, это действительно помогло бы заставить их быть немного меньшими.

Пространство, требуемое BitSet, кажется, вследствие того, что массив longs раньше отступал, структура данных имеет тенденцию удваиваться каждый раз, когда это расширено для содержания большего количества битов:

// BitSet's resizing code
private void ensureCapacity(int wordsRequired) {
  if (words.length < wordsRequired) {
    // Allocate larger of doubled size or required size
    int request = Math.max(2 * words.length, wordsRequired);
    words = Arrays.copyOf(words, request);
    sizeIsSticky = false;
  }
}

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

14
задан Kaleb Brasee 19 January 2010 в 03:56
поделиться

1 ответ

Если вы создаете Bitset , используя конструктор bitset (int nbits) , вы можете указать емкость. Если вы догадаетесь, что ошибка неправильная, и перейдите, она удвоит размер.

Класс класс имеет метод Trimtosize , который является частным и называется pormentObject и Clone (). Если вы клонируете свой объект или сериализуйте его, он будет обрезать его до правильной длины (при условии, что класс по его расширению расширил его через метод Ennerecapacity).

20
ответ дан 1 December 2019 в 12:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: