判断集合中存在重复是常见编程任务之一,当集合中数据量比较大时我们通常希望少进行几次扫描,这时双重循环法就不可取了。位图法比较适合于这种情况,它的做法是按照集合中最大元素max创建一个长度为max+1的新数组,然后再次扫描原数组,遇到几就给新数组的第几位置上1。如遇到5就给新数组的第六个元素置1,这样下次再遇到5想置位时发现新数组的第六个元素已经是1了,这说明这次的数据肯定和以前的数据存在着重复。这种给新数组初始化时置零其后置一的做法类似于位图的处理方法故称位图法。它的运算次数最坏的情况为2N。如果已知数组的最大值即能事先给新数组定长的话效率还能提高一倍。Bloom filter可以看做是对bit-map的扩展。下面为利用位图法实现整形数组的排序代码。
class BitmapSort {
2:
/**
* 使用位图法进行排序
* 找到最小值和最大值,申请位图数组,对应位赋值为1,最后依次输出。
* @param arr
*/
int[] arr) {
int max = arr[0];
int min = max;
int i : arr) {
if (max < i) {
13: max = i;
14: }
if (min > i) {
16: min = i;
17: }
18: }
+ min);
20:
int[max - min + 1];
int i : arr) {
int index = i - min;
24: bitArr[index]++;
25: }
26:
);
int i : bitArr) {
);
30: }
31: System.out.println();
32:
int index = 0;
int i = 0; i < bitArr.length; i++) {
while (bitArr[i] > 0) {
36: arr[index] = i + min;
37: index++;
38: bitArr[i]--;
39: }
40: }
41: }
42:
void main(String[] args) {
int[] arr = { 1, 7, -3, 0, 0, 6, 6, 9, -11 };
45: bitmapSort(arr);
);
int i : arr) {
);
49: }
50: }
51: }