大数据量的排序和判重,可以用位图法和布隆过滤器
位图法:
将数值按顺序分布于二进制位的空间
实现位图法非常容易,只需要一些基本的位操作将要存储的数值转化到相应的数组位置上去
基本操作是s.get(n) == ((arr[n/len] & (1<<(n%len))) != 0),其中len表示使用的存储类型长度,比如int是32,byte是8
arr[n/len]是定位到存储该数使用的二进制位值
(1<<(n%len))表示该值的二进制表达位,相与就能确定该位是否为0,类似于判断奇偶用n&1!=0
代码:
package Bitmap;
public class Bitmap {
int[] bitArray;
//掩码,用来代替求余操作
int INT_MASK=(1<<5)-1;
Bitmap(int max){
//传入最大值确定bitmap尺寸,>>5表示/32
bitArray=new int[(max>>5)+1];
}
//s.get(n) == ((bytes[n/8] & (1<<(n%8))) != 0)
public boolean get(int x){
return (bitArray[x>>5] & (1 << (x&INT_MASK)))!=0;
}