@最近被问到怎么在很多数据(如20亿)中实现快速查找,没有答上来…
@假设是用unordered_map来实现,查找效率为O(N),假设元素为int类型,则需要20亿*4Bytes,这显然太占资源
@后来了解到bitmap,也就是所谓的位图,用一两bit表示该数是否出现过,例如int为8字节,32位,则可存进0-31的数,则20亿数需要20亿/32Bytes,这样便大大节约了资源
@实现代码如下,主要实现其添加、删除与查找,通过位运算实现:
1.如实现查找功能,则通过int_/32可知该数应该属于第几组,通过int_%32可知该数在该组的下标树,通过与1<<location则可知查找的该位置是否为1判断该数是否存在
2.添加与删除功能原理类似,不再赘述…
class my_bitmap {
public:
my_bitmap(){
memset(a, 0, sizeof(a));
};
//添加
void insert(const int& int_) {
int arr = int_ / 32;
int location = int_ % 32;
a[arr] |= (1<<location);
}
//删除
void erase(const int& int_) {
int arr = int_ / 32;
int location = int_ % 32;
a[arr] &= ~(1<<location);
}
//查找
void find(const int& int_) {
int arr = int_ / 32;
int location = int_ % 32;
if (a[arr] & 1 << location) {
cout << "is find!" << endl;
}
else cout << "is not find!" << endl;
}
private:
int a[100];//可以存100*32个数
};
@代码若有误,欢迎指正!!!
@理解若有误,欢迎指正!!!
@bitmap还能够实现快速排序、快速去重,有兴趣的可以自己了解下