现在有1千万个随机数,随机数的范围在1到1亿之间。现在要求写出一种算法,将1到1亿之间没有在随机数中的数求出来。

本文介绍了一种算法,通过位运算高效地处理1千万个在1到1亿范围内的随机数,找出这个范围内未被包含的数。首先初始化标志数组和位标记表,然后将随机数映射到标志数组中,最后通过按位与操作找出未出现的数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
using namespace std;

//1亿
#define BILL (1000*1000*1000)

//用int的32位存储标志: 1亿/32bit
#define FLAGS 3125000

//随机数个数
#define RANCOUNT (1000*10000)

#define BIT_SIZE 32

void printArray(int* arr, int len) {
	cout << "数组:" << endl;
	for (int i = 0; i < len; ++i) {
		cout << arr[i] << " ";
	}
	cout << endl;
}

int* initRandom(int len, int range) {
	int* randoms = new int[len];
	srand(unsigned(time(0)));
	for (int i = 0; i < len; i++) {
		randoms[i] = rand() % range;
	}
	return randoms;
}

void initTable(int* table, int size) {
	for (int i = 0; i < size; ++i) {
		table[i] = 1 << i;
	}
}

void mapRandomsIntoFlags(int* randoms, int ranLen, int* flag, int* table) {
	/*
	 * 将随机数转化存入flag数组,先找到在哪个flag[i]元素,到找到里面对应的bit位,用按位或操作插入
	 * table[i]=1<<i
	 */
	for (int i = 0; i < ranLen; ++i) {
		int id = (randoms[i] - 1) / BIT_SIZE;
		flag[id] |= table[(randoms[i] - 1) % BIT_SIZE];
	}
}

void findNotFlag(int* flags, int bill, int* table) {
	/*判断数是否存在,先找到数对应哪个flag[i],再找到里面对应的bit位,用按位与操作判断是否存在*/
	for (int i = 1; i <= bill; ++i) {
		int id = (i - 1) / BIT_SIZE;
		if (!(flags[id] & table[(i - 1) % BIT_SIZE])) {
			cout << i << endl;
		}
	}
}

/*给出具体代码机器问题无法验证*/
int main() {
	//	1千万个随机数,随机数的范围在1到1亿之间
	int* randoms = initRandom(RANCOUNT, BILL);

	//	用bit来标记数是否存在,int有32bit,则有1亿/32=3125000
	int*flags = new int[FLAGS];
	memset(flags, 0, FLAGS * sizeof(int));

	//存在2^0,2^1....2^31标记用来操作指定bit
	int* table = new int[BIT_SIZE];
	initTable(table, BIT_SIZE);

	mapRandomsIntoFlags(randoms, RANCOUNT, flags, table);

	findNotFlag(flags, BILL, table);

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值