目录
问题:给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。
2.简单实现一个位图
3.如何利用位图求两个集合的交集、并集
Q:效率都不太好,有没有更好办法呢?
A:让一个比特位来标记一个元素存在或者不存在
40个整形放在位图里面只需要0.5G,而且查找的时间复杂度:O(1),非常棒;
位图的概念:所谓位图,就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景。通常是用来判断某个数据存不存在的。
template
class bitset{public:bitset(){_bits.resize(N / 8 + 1, 0);}void set(size_t x)//把状态改为存在{//看在哪一个字节里面size_t i = x / 8;//第几位size_t j = x % 8;//大小端没有区别,找也是按这种方法找_bits[i] |= (1 << j);}void reset(size_t x)//把状态改为不存在{size_t i = x / 8;size_t j = x % 8;_bits[i] &= (~(1 << j));}bool test(size_t x)//查询是否存在{size_t i = x / 8;size_t j = x % 8;return _bits[i] & (1 << j);}private:std::vector _bits;};
1.并集
2.交集
总结一下:位图的可以做些什么?
A:1. 快速查找某个数据是否在一个集合中 2. 排序(全部插入,遍历一遍) 3. 求两个集合的交集、并集等