[英]What is the fastest way to associate a boolean flag to every possible integer value?
如果我有一個字節而不是一個整數,則可以輕松地創建一個具有256個位置的布爾數組並檢查:
boolean[] allBytes = new boolean[256];
if (allBytes[value & 0xFF] == true) {
// ...
}
因為我有一個整數,所以我不能有一個大小為20億的數組。 檢查整數是真還是假的最快方法是什么? 一組整數? 哈希表?
編輯1:我想為每個可能的整數(20億)關聯一個真或假標志。
EDIT2:我有ID X(整數),我需要一種快速的方法來知道ID X是ON還是OFF。
BitSet
無法處理負數。 但是有一個簡單的方法可以解決:
class BigBitSet {
private final BitSet[] bitSets = new BitSet[] {new BitSet(), new BitSet()};
public boolean get(int bitIndex) {
return bitIndex < 0 ? bitSets[1].get(~bitIndex)
: bitSets[0].get(bitIndex);
}
...
}
第二個BitSet用於負數,它通過'〜'運算符進行轉換(這也比簡單地取反更好,因為它也適用於Integer.MIN_VALUE
)。
內存消耗可能高達4 Gib,即大約524 MB。
我什至對此不屑一顧。
您的計算機可以存儲的最小信息量對嗎? 一個位有兩個狀態,您想要兩個狀態,因此,只需說bit = 0為false和bit = 1為true。
因此,您需要盡可能多的位,即2 ^ 32 = 4,294,967,296。 您可以將8位裝入一個字節,因此只需要2 ^ 32/8 = 536,870,912字節。
從那里很容易地跟隨代碼來尋址字節中的每個位...
byte[] store = new byte[1 << 29]; // 2^29 bytes provide 2^32 bits
void setBit(int i) {
int byteIndex = i >>> 3;
int bitMask = 1 << (i & 7);
store[byteIndex] |= bitMask;
}
boolean testBit(int i) {
int byteIndex = i >>> 3;
int bitMask = 1 << (i & 7);
return (store[byteIndex] & bitMask) != 0;
}
java.util.BitSet實際上在一個不錯的類中提供了相同的預制,只有您可以使用它來存儲最多2 ^ 31位,因為它不適用於負位索引。
由於您使用的是Java,因此請使用BitSet。 快速簡便。 如果願意,還可以使用原始long數組或BigInteger數組,但這確實是BitSet的目的。
http://docs.oracle.com/javase/7/docs/api/java/util/BitSet.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.