欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

玩转C++:探索位图、布隆过滤器与哈希分割的奥秘

最编程 2024-02-17 12:03:04
...

1. 给定100亿个整数,设计算法找到只出现一次的整数?

在位图中我们表示一个数存在,则对应的比特位是1,那么我们可以使用两个比特位表示一个数出现的次数:

       出现0次 -> 00

       出现1次 -> 01

       出现2次及以上 -> 10

那么在插入中就需要做一改进

在插入时对应的是00,那么就改为01,如果是01,就改为10。

代码实现:

namespace count_num
{
	template<size_t N>
	class Oncebitset
	{
	public:
		//插入
		void set(size_t x)
		{
			size_t i = x / 32;    //第几个整型
			size_t j = x % 32;    //第几个比特位
			if (_bs1[x] == false && _bs2[x] == false)   //00
			{
				_bs2.set(x);   //对应的比特位改为1      //01
			}
			else if (_bs1[x] == false && _bs2[x] == true) //01
			{
				_bs1.set(x);   //对应的比特位改为1
				_bs2.reset(x); //对应的比特位改为0     //10
			}
		}
		void PrintOnce()
		{
			for (size_t i = 0; i < N; i++)
			{
				if (_bs1.test(i) == false && _bs2.test(i) == true)
				{
					cout << i << endl;
				}
			}
			cout << endl;
		}
	private:
		bitset<N> _bs1;
		bitset<N> _bs2;
	};
}


2. 给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?

将这两个文件分别映射到位图中,若一个值在这两个位图中都存在,那么便是交集。


3. 位图应用变形:1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数

同样的还是使用两个比特位来表示一个数出现的次数:

       出现0次 -> 00

       出现1次 -> 01

       出现2次 -> 10

       出现3次及以上 -> 11