40亿个非负整数中找到出现2次的数或所有数的中位数

题目

32位无符号整数范围是0---4294967295,现在有40亿个无符号整数,可以最多使用1GB的内存,找出所有出现了2次的数

原题目的解决方法

4294967295的bit数组的大小是500MB,我们申请bit Arr是数组,长度是42949672952,大小恰好为1GB,这个时候如果第一遇到num,那么我们把bitArr[num2]和bitArr[num2+1]置为01,如果是第二次遇到bitArr[num2]和bitArr[num2+1]置为10,第三次遇到bitArr[num2]和bitArr[num2+1]置为11,
第四次以及以上就不改变了.这个时候bitArr就生成了,再出bit[i
2]和bit[i*2+1]为10的数,对应的i就是出现了两次的数.

补充题目

可以使用最多10MB的内存,怎么要找到40亿个整数的中位数.

分析

使用10MB的内存.所以我们想到要通过分区间的方式处理,那我们分多少个区间哪,每一个区间长度为长度为2MB,那么占空间大小为8MB...具体看书


图片.png

.现在10MB的空间还没有被分配,我们接下来就是.创建一个数组arr[0...2147],然后遍历这40亿个数,然后遍历到的每个数,都让这些书对应的区间加加,遍历完之后,我们找第20个亿的数放在哪个位置(因为是中位数,然后这个又是按照顺序存储的)


图片.png

所以真正的用到10MB限制的是,已经确定了中位数的区间和在区间上的位置.

这个时候我们遍历40亿个数,其中只关心这个区间上的数,因为当前的区间可能有重复的值,所以要计算词频,最后恰好是第0.002亿的数就是结果(0.002亿是举的例子)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容