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

本文介绍了一种位图数据结构的实现方法,并提供了初始化、设置和重置位图的操作示例。通过使用位图可以高效地管理和存储大量二进制数据。
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
typedef struct BitMap 
{ 
size_t* _bits;//
size_t _range;//
}BitMap; 

void BitMapInit(BitMap* bm, size_t range)
{
	assert(bm);
	bm->_range=range;
	bm->_bits=(size_t*)malloc(sizeof(size_t)*(range/32+1));//malloc(sizeof(size_t)*(range/32+1))指的是开辟空间存放足够大的range个数的存在(1)或不存在(0)的状态
    memset(bm->_bits,0,sizeof(size_t)*(range/32+1));

}
void BitMapSet(BitMap* bm, size_t x)//添加数字使其状态置为1 
{
	size_t index=x/32;//index指的是x的状态在第几个字节中
	size_t num=x%32;//num指的是x的状态在某个字节中的第几个比特位
	bm->_bits[index]|=(1<<num);//index字节中num位置状态置为1
} 
void  BitMapReset(BitMap* bm, size_t x)//判断数字是否存在 
{
	size_t index=x/32;
	size_t num=x%32;
	bm->_bits[index]&=(1<<num);
}

int BitMapTest(BitMap* bm, size_t x) 
{// x存在返回0,不存在返回1 

	BitMapInit(bm, -1);
	
	//BitMapSet(bm,x);
    BitMapReset(bm,x);
    if(bm->_bits[x/32]==0)
		return 1;
	else
		return 0;

     
}
int main()
{
	BitMap bm;
	unsigned int n=1000000;
	int ret=BitMapTest(&bm,n);
	if(ret==1)
		printf("[%u]->不存在\n",n);
	else
		printf("[%u]->存在",n);

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值