目录
位图的概念
位图的实现
寻找位置
set
reset
test
面试题
1.给定100亿个整数,设计算法找到只出现一次的整数?
2. 给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?
3. 位图应用变形:1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数.
位图的概念
如果出现海量数据判断数据在不在问题,我们用哈希表无法解决,我们可以利用哈希思想来创建一个新的stl容器,用bit位上的0或1来表示数据存在与否的哈希表
stl库中存在bitmap
主要有三个接口
set插入元素,置为1
reset删除元素,置为0
test测试元素在不在,判断是否为1
位图的实现
位图的底层是数组
位图的模板参数我们需要传需要处理的数据个数,并在初始化的时候设置数组大小为N/32+1,因为一个int是32个bit位
寻找位置
在数组中bit位分布
可以用需要找的值key/32寻找到在哪一个int数据上,再用key%32寻找到在这个int的第几个bit位上
set
我们向让bit位这个位变成1,可以用这个int数据与(1左移之后值那一位变为1,其他区全为0)之后进行按位或赋值
reset
我们向让bit位这个位变成0,可以用这个int数据与(1左移之后值先进行按位取反是那一位变为0,其他区全为1)再进行按位与赋值
test
我们测试这个bit位是否为1,可以之间用这个int数据与(1左移之后值那一位变为1,其他区全为0)相与
面试题
1.给定100亿个整数,设计算法找到只出现一次的整数?
首先100亿个整数会不会有空间的问题?答案是肯定不会的,因为开空间和数据范围有关系,和数据个数没有关系,100亿个整数,每个数的范围都是42亿(2^32-1)之内,不会说有100亿个不重复的整数
所以这里我们可以使用位图进行解决,这里找只出现一次的整数,我们可以使用两个位图来解决
1.如果没有出现,两个位图全为0
2.如果只出现一次,两个位图一个为1,一个为0
3.如果出现两次及以上,两个位图全为1
0次 00
1次 01
两次及以上 10
代码:
2. 给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?
思路:我们分别将两个100一亿个整数存储到两个位图当中,然后对两个位图按比特位进行相与
3. 位图应用变形:1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数.
这题与题一类似
我们改为
0次 00
1次 01
2次 11
3次及以上 10
代码