算法通关村15关 | 从40亿中产生一个不存在的整数

1. 从40亿中产生一个不存在的整数

题目

给定一个输入文件,包含40亿个非负整数,请设计一个算法,产生一个不存在该文件中的整数,假设你有1GB的内存来完成这项任务。

进阶:如果只有10MB的内存可用,该怎么办?

1.1 位图存储大数据原理

如果用哈希表来保存出现过的数,40亿个数都不同,则哈希表的记录数为40亿条,存一个32位整数需要4B,所以最差的情况下需要40亿*4B=160亿字节,大约需要16GB的空间,不符合要求。

40亿/8bit = 5亿字节,大约0.5GB的数组就可以存下40亿个整数。

位图存储元素规则:申请一个长度为4 294 967 295的bit类型的数组bitArr(就是Boolean类型),bitArr上的每一个位置只可以表示0或1,8个bit位1b,左移长度为4 294 967 295的bit类型的数组占用空间500MB,满足题目要求。

需要两次遍历,第一次遍历将出现的数字botArr相应位置设为1,比如1000,就把bitArr[1000]设置为1,

第二次遍历,看看那个位置没有被设置为1,那这个数就存在,例如bitArr[8888]=0.那么8888这个数就不存在,遍历完之后,所有没出现的数字都可以找出来。

1.2 使用10MB来存储

如果只有10MB我们可以将500MB分为50块,进行操作,用时间换空间,应为计算机都是2的倍数,所以我们可以分为64块,每块大小67 108 864个数。

同样需要两次遍历,第一次遍历将存在数字的位置设为1,不同于上面的操作的是在第几块我们只要落在这个区间的数字,比如第37区间,num满足num/67 108 864 == 37.其余数字暂时忽略。

第二次遍历找数字为0的位置。不同于上面的是,第i个位置,最终的数字结果是67 108 864*37+i,这个数就是没出现的数。

代码不需要实现,面试的时候能说明白即可,代码写出也不好测试。

你可能感兴趣的:(算法通关村专栏,算法)