面试题:给40亿个不重复的无符号整数,没排过序,给一个无符号整数如何快速判断这个数是否在这40亿个数中

面试中遇到一个问题,需要在40亿个不重复且无排序的无符号整数中判断给定数值是否存在。位图数据结构提供了一个高效的解决方法。通过将每个整数映射到二进制位,可以实现快速查找。如果位图对应位置为1,则整数存在,反之则不存在。
摘要由CSDN通过智能技术生成
//**********************位图***********************

//腾讯面试题:
//           给40亿个不重复的无符号整数,没排过序,给一个无符号整数如何
//           快速判断这个数是否在这40亿个数中

//解题思路:
//(1)直接存进内存
//40亿个无符号数,如果放到内存,就需要开辟4*4G=16G的空间,因为数的范围不确定,所以
//开辟尽可能大的空间来存放,需42亿9千万×4字节的空间
//(2)位图   
//位图:在一块内存区域的每个比特存0或1,表示其对应的元素不存在或者存在
//位图优点: 速度快,内存空间占用小,能表示大范围的数据

//比较:用位图的话,需(42亿9千万×4字节)/32字节=大约500M的空间内存就可以
//      把40亿个数全部放进内存

//按位与&:都为真时才为真,即都为1时才为1
//按位或|:都为假时才为假,即都为0时才为0
//按位异或^:两个数不同时为1
//左移<<是往高位移     如在一个从0到31的比特位中,让1<<2,则比特位变为00100000  00000000   00000000  00000000
//右移>>是往低位移   x>>1等于x/2   x>>5等于x/32

#include <iostream>
#include <vector>
using namespace std;

class BitMap
{
public :
                BitMap( size_t range )
                                :size(0)
                {
                                arr.resize(( range >> 5) + 1);</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值