大数据的处理算法——BitMap算法
首先我们来看一个问题:
如何判断一个整数是否在40亿个整数之中?
当时我看到这个问题首先想到的是利用一个map或者set进行存储(/笑哭)
但是一个整数4个字节,40亿个整数就是160亿个字节,需要16GB的内存(/惊讶)
如果分多次加载就需要利用到磁盘的IO,但是磁盘的IO读取速度远远低于内存的读取速度
所以是不可取的!!!
那么可以采用分布式的算法来实现,利用8台计算机,每台计算机2G内存,将数据分散到这8台计算机中进行处理,这样的效率就比较能够接受。
但是还有没有更好的方式呢?
有!!!
是什么?
Bitmap算法!!!
Bitmap算法
首先我们来了解一下bitmap算法是个啥?
1:Bit-Map算法又名位图算法,其原理是,使用下标代替数值或特定的意义,使用这个位为0或者1代表特性是否存在。
2:Bit-Map算法具有效率高,节省空间的特点,适用于对大量数据进行去重,查询等。
说简单点
就是咱们把每个数据的状态存在为1,不存在为0,利用bit字节来进行存储,这样大大的节约了空间!!
那么可以简单的联想到BitMap的应用领域:
排序,查找,存储一个用户的各种标签数据啊,用bitmap算法都是一种比较棒的方式。
那么回到题目:
如何判断一个整数是否在40亿个整数之中?
我们来看一段代码,当然这里我没用40亿这么大
我这里用10000000,其实也很大了(/doge)
import java.util.ArrayList;
import java.util.List;
public class BitMap {
private static final int N = 10000000;
private int[] a = new int[N/32 + 1];
/**
* 设置所在的bit位为1
* @param n
*/
public void addValue(int n) {
//int row = n / 32;
int row = n >> 5;
// >>相当于/2的n次方,<<相当于*2的n次方
a[row] |= 1 << (n & 0x1F);
// |=是相当于a 和=后面的值做或运算然后赋值给a
// 0x在计算机中代表16进制,F代表16 1F = 1*F + F = 32
// << >> 实际为java中的移位运算符 >> 向左移动一位即等于乘以2
// << 为向右移动即等于除以2
}
/**
* 判断所在bit位是否为1
* @param n
* @return
*/
public boolean exits(int n) {
int row = n >> 5;
return (a[row] & (1 << (n & 0x1F))) != 0;
}
public void display(int row) {
System