在大型未排序列表中查找n个最大值,一次只处理一页值

时间:2015-02-18 05:16:40

标签: java sorting heap

我在概念上苦苦挣扎。

如何编写程序以查找大约20亿个列表中最高的10,000个数字?假设计算机只有足够的容量一次处理大约10,000个数字(在20亿个中)。排除程序本身的任何开销,假设我在主内存中有足够的空间来一次处理10,000个数字。

有人建议我使用堆来处理信息,但是当我无法一次对所有数字进行排序时,我没有看到如何执行此操作。

1 个答案:

答案 0 :(得分:3)

  1. 将前10,00个数字添加到结果列表中。 (保留此列表以便进一步执行步骤)
  2. 迭代20亿个数字中的其余数字;对于每一个,检查它是否大于结果列表中的最小数字,如果是,则用这个替换最小的数字。
  3. 这样你只需要在内存中同时保留10,000个数字。

    EDIT 25/2/15:

    假设n =结果大小,m =输入大小,在结果列表中必须替换的数字的次数(此处为{n = 1的情况计算Number of assignments necessary to find the minimum value in an array?)可以扩展到这种情况:

    double averageReplacementCount = 0;
    for (int i = n; i < m; i++) {
        averageReplacementCount += 1.0 / (i + 1);
    }
    

    对于n = 10,000和m = 2,000,000,000,这仅为~12.206(<13!)。

    这仅适用于数字均匀分布的情况。如果它们正在下降,则不需要替换,但如果它们是升序(最坏情况!),则需要替换(m-n)。

    这使得结果列表的数据结构选择可能不重要,只要最小值被缓存并且可以在恒定时间内进行比较。