#include<iostream>
#include<stdio.h>
using namespace std;
//对内存中的元素进行初始化
void init(char* data, int len) {
unsigned int n = len * 8;//获取实际数字的个数
for (unsigned int i = 0; i < n; i++) {
if (i % 3 == 0) {//假定能被3整除的数表示在这串数字里面
char* p = data + i / 8;//表示指针的移动
*p = *p | (1 << (i % 8));//使用位运算来将存在的数的位置为1
}
}
}
int check(char* data, int len, int value) {
char* p = data + value / 8;//表示指针的偏移(确定当前数所在的位置)
return *p & (1 << (value % 8));//使用与运算,位的位置同为1才为1否则返回为0
}
int main(void) {
//分配一块足够大的内存用来表示位图
unsigned int a = 4000000000;//假定有40亿个数
int len = a / 8 + 1;//多分配一个字节
char* data = (char*)malloc(len);//分配足够大的内存来存纳这些数据
memset(data, 0, len);
//对位图中的数据进行初始化
init(data, len);
while (1) {
cout << "请输入要检测的数:[输入-1退出]";
int value;
cin >> value;
if (value == -1) break;
if (check(data, len, value)) {
cout << value << "在数据集合中" << endl;
}
else {
cout << value << "不在数据集合中" << endl;
}
}
return 0;
}
位图算法的实现
最新推荐文章于 2024-07-25 11:27:31 发布