2010-01-19 11 views
14

Tôi đang tìm một cách rất nhỏ gọn để lưu trữ một bitarray độ dài biến dày đặc trong Java. Ngay bây giờ, tôi đang sử dụng BitSet, nhưng dường như sử dụng trung bình 1.5 * n bit dung lượng lưu trữ cho một bit bit có kích thước n. Thông thường, đây không phải là một vấn đề, nhưng trong trường hợp này bitmap được lưu trữ là một phần khá quan trọng trong bộ nhớ của ứng dụng. Vì vậy, nó sẽ thực sự giúp đỡ để có được chúng được một chút nhỏ hơn.Rất nhỏ gọn Bitarray trong Java

Không gian theo yêu cầu của BitSet có vẻ là do thực tế rằng các mảng thép dài sử dụng để sao cấu trúc dữ liệu có xu hướng tăng gấp đôi mỗi lần nó được mở rộng để tổ chức nhiều bit:

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

tôi có thể viết thực hiện thay thế của riêng tôi về BitSet giúp cân bằng cấu trúc dữ liệu phụ trợ một cách thận trọng hơn. Nhưng, tôi thực sự ghét chức năng trùng lặp đã có trong thư viện lớp chuẩn nếu tôi không phải làm như vậy.

+1

tôi muốn có một thời gian khó tưởng tượng này sẽ là trong thư viện chuẩn của Java. Nó không thực sự được thiết kế cho nó. Tôi đặt cược bạn có thể tìm thấy một thư viện của bên thứ ba mặc dù. – Pace

+0

Tôi nghĩ rằng trong trường hợp thực hiện tùy chỉnh của bạn sẽ là một đặt cược tốt hơn. – cx0der

Trả lời

20

Nếu bạn tạo BitSet bằng cách sử dụng hàm tạo BitSet(int nbits) bạn có thể chỉ định dung lượng. Nếu bạn đoán công suất sai, và đi qua, nó sẽ tăng gấp đôi kích thước.

Lớp BitSet có phương thức trimToSize riêng tư và được gọi bởi writeObject và clone(). Nếu bạn sao chép đối tượng của mình, hoặc sắp xếp nó, nó sẽ cắt nó thành độ dài chính xác (giả sử lớp mở rộng nó thông qua phương thức EnsureCapacity).

+8

Yup. Lưu ý rằng bạn không thực sự cần sử dụng phiên bản đã sao chép. Bản gốc được cắt (!). –

+0

Điều đó khá thông minh. Cảm ơn! – dmcer

+0

Ít nhất trong [nguồn openjdk] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/BitSet.java#1085) trên GrepCode , bản gốc không được cắt trong trường hợp bạn chỉ định kích thước ban đầu và mảng không cần thiết để phát triển. – user2357112