这个算法相当的有创意,对于处理一些海量数据来说,该算法太具有代表性了,直接使用了bit为单位来存储数据,大大节省了存储空间,关键还有另外一点就是该算法对存储数据的检索效率那是相当的高。
package com.au.algorithm;
import java.util.ArrayList;
import java.util.List;
/**
* 所谓的Bit-map就是用一个bit位来标记某个元素对应的Value,
* 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。
*
* 如果说了这么多还没明白什么是Bit-map,那么我们来看一个具体的例子,
* 假设我们要对0-7内的5个元素(4,7,2,5,3)排序(这里假设这些元素没有重复)。 那么我们就可以采用Bit-map的方法来达到排序的目的。
* 要表示8个数,我们就只需要8个Bit(1Bytes),首先我们开辟1Byte的空间, 将这些空间的所有Bit位都置为0。
*
* @author fuyouming
*
*/
public class BitMap {
private int min = 0;
private int max = 10;
private byte[] bytes;
public BitMap(int min, int max) {
this.min = min;
this.max = max;
init();
}
public BitMap() {
init();
}
private void init() {
int l = (max - min + 1) + 8 / 8;
bytes = new byte[l];
for (int i = 0; i < l; i++) {
bytes[i] = 0;
}
}
public void add(int i) {
i -= min;
int idx = i / 8;
int off = i % 8;
ensureCapacity(idx);
// 位左移,将对应的Bit位赋值1
bytes[idx] = (byte) (bytes[idx] | 0x01 << off);
}
private void ensureCapacity(int index) {
if (index + 1 > bytes.length) {
byte[] oldBytes = bytes;
bytes = new byte[Math.max(10, index) + 1];
System.arraycopy(oldBytes, 0, bytes, 0, oldBytes.length);
}
}
public void addAll(int[] intArr) {
for (int i : intArr) {
add(i);
}
}
public List<Integer> getAll() {
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < bytes.length; i++) {
for (int j = 0; j < 8; j++) {
// 判断该位上是否是1,进行输出,这里的判断比较笨。
// 首先得到该第j位的掩码(0x01<<j),将内存区中的
// 位和此掩码作与操作。最后判断掩码是否和处理后的
// 结果相同
if ((bytes[i] & (0x01 << j)) == (0x01 << j)) {
list.add(i * 8 + j + min);
}
}
}
return list;
}
public static void main(String[] args) {
java.util.Random ran = new java.util.Random();
int intArr[] = { 3, 5, 2, 10, 6, 12, 8, 14, 9 };
BitMap bitmap = new BitMap(2, 14);
bitmap.addAll(intArr);
// BitMap bitmap = new BitMap(10000000, 99999999);
// for (int i = 0; i < 100000; i++) {
// bitmap.add(Math.max(10000000 + ran.nextInt(99999999), 99999999));
// }
List<Integer> list = bitmap.getAll();
for (Integer o : list) {
System.out.println("out: " + o);
}
}
}