位图
位图介绍
位图(bitmap),适用于存储海量,非负整数,不重复的数据.假设我们用int数组来存放数据,1GB相当于是10亿字节,那么当存储40亿整形数据时,一个整形数据占用4个字节,因此一共需要40*4/10=16G,而16G远远超过了普通电脑的内存.而用位图存储40亿整形数据时,因为1个bit来存储1个数据,因此只需要16/4/8=0.5G
此次位图的介绍采用的是byte数组,因此位图中1个元素实际上能够存储的元素个数为8(1byte = 8bit)
假设我们要存储的数据为3,7,11,14.那么我们首先需要将数据定位到某一个具体的下标里,我们可以通过除8来实现,之后我们需要将数据定位到某1位上,我们可以通过模8来实现
那么如何通过代码将11这个元素存储到具体的位置上?可以通过与运算得到
int arrIndex = val / 8; // 下标
int bitIndex = val % 8; // 位
bitSet[arrIndex] |= (1<< bitIndex); // 通过与运算实现存储
位图代码实现
public class MyBitSet {
// 1byte == 8bit,因此一个byte可以存放8个元素
private byte[] bitSet;
private int userSize;
public MyBitSet(){
this.bitSet = new byte[1];
}
public MyBitSet(int n){
// 这里进行初始化时存放n个元素实际上只需要(n/8+(byte)1)个大小
this.bitSet = new byte[n/8+(byte)1];
}
public byte[] getBitSet() {
return bitSet;
}
public void setBitSet(byte[] bitSet) {
this.bitSet = bitSet;
}
public int getUserSize() {
return userSize