傅老师课堂:BitMap

        这个算法相当的有创意,对于处理一些海量数据来说,该算法太具有代表性了,直接使用了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);
		}
	}
}

点赞