2010-01-19 25 views
14

Java'da yoğun değişken uzunluklu bitarray depolamanın çok kompakt bir yolunu arıyorum. Şu anda, BitSet kullanıyorum, ancak n boyutunda bir bit vektörü için ortalama 1.5 * n bitleri depolama alanı kullanıyor görünmektedir. Tipik olarak, bu bir problem değildir, ancak bu durumda depolanan bitardamarlar, uygulamanın bellek ayak izinin oldukça önemli bir parçasıdır. Yani, onları biraz daha küçük olmaya yardımcı olur.Java'da Çok Kompakt Bitarray

BitSet gerektirdiği boşluk, veri yapısı geri almak için kullanılan uzun ürünler dizisi daha fazla bit tutmak için genişletilmişse her çift için eğilimi göstermesine bağlı gibi görünmektedir

:

// 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; 
    } 
} 

I yazabiliriz Arka uç veri yapısını daha muhafazakar bir şekilde ölçekleyen kendi alternatif uygulamam. Ancak, gerekmiyorsa standart sınıf kitaplıklarında bulunan işlevleri çoğaltmaktan gerçekten nefret ediyorum.

+1

Ben zor bir zaman standart Java kütüphanede olacağını bunları hayal olurdu. Gerçekten bunun için tasarlandığı şey değil. Eminim üçüncü parti kütüphanesi bulabilirsin. – Pace

+0

Bence sizin durumunuzda özel uygulama daha iyi bir bahis olacaktır. – cx0der

cevap

20

oluşturucu BitSet(int nbits) yapıcısını kullanarak oluşturursanız, kapasiteyi belirtebilirsiniz. Kapasiteyi yanlış tahmin ederseniz ve giderseniz, boyutu iki katına çıkar.

BitSet sınıfında, özel olan ve writeObject ve clone() tarafından çağrılan bir trimToSize yöntemine sahiptir. Nesnenizi klonlarsanız veya serileştirirseniz, doğru uzunluğa (sınıfın overclock'u, warrantyCapacity yöntemiyle genişletildiğini varsayarak) keser.

+8

Yup. Kopyalanan sürümü gerçekten kullanmanız gerekmediğini unutmayın. Orijinal kırpılmış (!). –

+0

Bu oldukça zekice. Teşekkürler! – dmcer

+0

En azından [openjdk kaynağında] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/BitSet.java#1085) GrepCode'da Orijinal bir boyut belirttiğiniz ve dizinin büyümesi gerekmediği durumda orijinali kırpılmaz. – user2357112

İlgili konular