【发布时间】:2011-09-03 14:38:27
【问题描述】:
给定硬盘上的 1 万亿个整数,找出其中最小的 100 万个。您一次最多可以在内存中容纳 100 万个整数。
一种方法是,从 1 万亿个整数中取出前 100 万个,然后对这 100 万个整数进行排序,然后将其存储回硬盘中。这样对每组100万个整数进行排序并存储在硬盘中。现在 100 万个整数的组被排序到 1 万亿个。现在比较所有排序组的第一个元素,它们中的最小值是 1 万亿中的最小值。将其存储为内存中的第一个元素。接下来,从最小元素所在的组中取出第二个元素,然后将其与所有其他组的第一个元素一起检查。以这种方式重复该过程,直到前100万个被排序并存储在内存中。
我还缺少更优化的方法吗?
【问题讨论】:
-
对我来说听起来像是家庭作业......
-
欧洲还是美国万亿?不过,无论哪种方式,都需要使用数百万个整数的大部分内存来一次对文件的三个部分进行内存映射,其余部分作为堆栈空间来运行 quickselect。
-
@Steve 我不知道有什么不同,仍然不知道是什么
-
@Chuck:美国万亿是 10^12。欧洲是 10^18,所以在第一步之后你会有 10^12 个排序的块。这是一个有点傻的问题:在大多数情况下,人们将美式英语用于任何与计算机相关的事情,所以通常会是前者。
-
如果您对 3 组 3 (413)(928)(657)=>(134)(289)(567) 进行排序,然后在索引 (0..2) 处选择最小的,您得到 (134) 会错过 2。还是我理解错了。