level 4
353948024
楼主
在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可。
我想了一下,这个思路不知道正不正确,怕自己想漏了
思路是:
例如,有数字 1,1,2,2,3,3,4,5,6
现在按照 1~2 3~4 5~6 分为三段,那么第一段n1的数字个数是4, n2为3, n3为2, 中位数是第5个,
在n2中第 5 - n1 = 2 个数, 也就是3, 如果数字总个数是偶数 取第 size/2 和 size/2+1的数字的平均值就好了
那么思路就是将整数从0~最大值分段;
记录每段的数字个数 为p1 p2.... pn;
中位数所在的段 Pm; 则中位数是第10G/2-(P1 + P2 + ... Pm-1) 个, 若该段的数字比较少了就直接读文件取出在该段范围中的数字排序即可
若该段数字还是比较多,针对Pm的分段起点和终点再次分段,重复这个过程
感觉按照这个办法内存很少就够了 为了效果好一点可以分段分细一点,内存绰绰有余
大家觉得有没有什么问题?
2018年03月01日 08点03分
1
我想了一下,这个思路不知道正不正确,怕自己想漏了
思路是:
例如,有数字 1,1,2,2,3,3,4,5,6
现在按照 1~2 3~4 5~6 分为三段,那么第一段n1的数字个数是4, n2为3, n3为2, 中位数是第5个,
在n2中第 5 - n1 = 2 个数, 也就是3, 如果数字总个数是偶数 取第 size/2 和 size/2+1的数字的平均值就好了
那么思路就是将整数从0~最大值分段;
记录每段的数字个数 为p1 p2.... pn;
中位数所在的段 Pm; 则中位数是第10G/2-(P1 + P2 + ... Pm-1) 个, 若该段的数字比较少了就直接读文件取出在该段范围中的数字排序即可
若该段数字还是比较多,针对Pm的分段起点和终点再次分段,重复这个过程
感觉按照这个办法内存很少就够了 为了效果好一点可以分段分细一点,内存绰绰有余
大家觉得有没有什么问题?