哈希变形—位图(给定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;
}

Java中this与super的区别 this&super; 什么是this,this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针。 Java关键字this只能用于方法的方法体内。当一个对象创建后, Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是this。 当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象的某个成员, 你便可以利用this来实现这个目的。要注意的是this只能在类中的非静态方法中使用, 静态方法和静态的代码块中绝对能出现this。this也可作为构造函来使用。在后面可以看到 而什么是super,可以理解为是指向自己超(父)类对象的一个指针, 而这个超类指的是离自己最近的一个父类。super的作用同样是可以作为构造函使用, 或者是获取被局部变量屏蔽掉的父类对象的某个同名变量的值。 super关键和this作用类似,是被屏蔽的成员变量或者成员方法或变为可见, 或者说用来引用被屏蔽的成员变量和成员成员方法。 作为构造函使用 super(参):调用父类中的某一个构造函(应该为构造函中的第一条语句)。 this(参):调用本类中另一种形式的构造函(应该为构造函中的第一条语句)。 要记住的几个关键点是: 在构造方法中this与super能共存;其次有this或super出现的地方必须是构造方法的第1句; 静态方法,也就是类方法中能有this和super关键字 1. 子类的构造函如果要引用super的话,必须把super放在函的首位. 复制代码 class Base { Base() { System.out.println("Base"); } } public class Checket extends Base { Checket() { super();// 调用父类的构造方法,一定要放在方法的首个语句 System.out.println("Checket"); } public static void main(String argv[]) { Checket c = new Checket(); } } 复制代码 结果: Base Checket 如果想用super继承父类构造的方法,但是没有放在第一行的话,那么在super之前的语句, 肯定是为了满足自己想要完成某些行为的语句,但是又用了super继承父类的构造方法。 那么以前所做的修改就都回到以前了,就是说又成了父类的构造方法了。 2. 在Java中,有时还会遇到子类中的成员变量或方法与超类(有时也称父类) 中的成员变量或方法同名。因为子类中的成员变量或方法名优先级高, 所以子类中的同名成员变量或方法就隐藏了超类的成员变量或方法, 但是我们如果想要使用超类中的这个成员变量或方法,就需要用到super. 。。。。。。。。。。。。。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值