哈希变形----位图(假设给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中)

位图:
  假设给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。

  • 遍历:将元素保存起来,遍历查找。
  • 树:创建一颗二叉搜索树。
  • 排序:排序之后用二分查找的方法。

  这些方法随着集合中元素的增加,我们需要的存储空间就越来越大、不过我们可以通过一个函数将一个元素映射成一个位矩阵中的一个点,这样一来,我们只要看看这个点是不是1就知道集合里有没有它了。
  一个整形可以表示的最大数是4294967296即2^32,所以最少需要2^32个bit来存放整形数,2^32bit=512M,即步浪费空间又可以很快的查找。


.h

#include<stdio.h>
#include<malloc.h>
#include<assert.h>
#include<stdlib.h>
#include<string.h>

typedef struct BitMap
{
    int *Bit;
    int capacity;//比特位的总个数
    int size;//比特位为1的个数
}BitMap;

//初始化比特位
void InitBitMap(BitMap *bit,int total);
//置1
void SetBitMap(BitMap *bit, int which);
//为1的个数
int SizeBitMap(BitMap *bit);
//置0
void ResetBitMap(BitMap *bit, int which);
//判断比特位是否为1
int TestSetMap(BitMap *bit, int<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值