哈希的应用
一、位图
情景:给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中???
看到查找元素的范围,暴力肯定是过不了的,我们要么二分要么哈希,但是二分要求排序,题目说没排过序,只剩下哈希,但是如果用正常的哈希表肯定不行,数据量太大了(可以算一下,大概15G),根本加载不进内存,更别谈放到哈希表中了,那怎么办?
这时候就需要用到位图---本质就是状态压缩版的哈希表,用一个比特位表示一个数字,大大压缩了数据量,(整形是4字节,如果是哈希表只能用来表示一个数字,但是位图可以用来表示4*8=32个数),数据量缩小了32倍,大概0.5G,具体的实现如下
namespace zxws
{
template <size_t N=100>
class bitset
{
public:
bitset()
{
bit.resize(N/32+1);
}
void set(size_t x)//增
{
size_t i = x / 32;
size_t j = x % 32;
bit[i] |= (1u << j);//1u代表unsigned int类型的1
}
void reset(size_t x)//删
{
size_t i = x / 32;
size_t j = x % 32;
bit[i] &= ~(1u << j);
}
bool test(size_t x)//查
{
size_t i = x / 32;
size_t j = x % 32;
return (bit[i] >> j) & 1u;
}
private:
vector<int>bit;
};
}
模拟实现没啥难度,就是要了解位运算,当然这只是位图的最重要的几个函数,还有一些其他的不常用的就不模拟实现了,有兴趣大家可以去查看文档
那么了解了位图的实现原理,我们再来看看下面的几个题
1. 给定100亿个整数,设计算法找到只出现一次的整数?2. 给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?

文章介绍了在大数据场景下,如何使用位图和布隆过滤器解决查找、交集和计数问题,以及哈希分割在处理大文件中的应用,包括精确算法和近似算法的区别。
最低0.47元/天 解锁文章
1099

被折叠的 条评论
为什么被折叠?



