Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在大型未排序列表中查找n个最大值,一次只处理一页值_Java_Sorting_Heap - Fatal编程技术网

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

Java 在大型未排序列表中查找n个最大值,一次只处理一页值,java,sorting,heap,Java,Sorting,Heap,我在概念上挣扎 我如何编写一个程序,从一个大约20亿大小的列表中找出最高的10000个数字?假设计算机一次只能处理大约10000个数字(20亿个数字中的一个)。除去程序本身的任何开销,假设我在主内存中有足够的空间一次处理10000个数字 有人建议我使用一个堆来处理信息,但当我不能同时对所有的数字进行排序时,我不知道该怎么做 将前10,00个数字添加到结果列表中。(保持此列表的排序,以便进一步执行步骤) 迭代20亿个数字中的其余部分;对于每一个,检查其是否大于结果列表中的最低数字,如果是,则用此数

我在概念上挣扎

我如何编写一个程序,从一个大约20亿大小的列表中找出最高的10000个数字?假设计算机一次只能处理大约10000个数字(20亿个数字中的一个)。除去程序本身的任何开销,假设我在主内存中有足够的空间一次处理10000个数字

有人建议我使用一个堆来处理信息,但当我不能同时对所有的数字进行排序时,我不知道该怎么做

  • 将前10,00个数字添加到结果列表中。(保持此列表的排序,以便进一步执行步骤)
  • 迭代20亿个数字中的其余部分;对于每一个,检查其是否大于结果列表中的最低数字,如果是,则用此数字替换最低数字 这样,您只需要同时在内存中保存10000个数字

    2015年2月25日编辑:

    假设n=结果大小,m=输入大小,则必须在结果列表中替换一个数字的次数(此处针对n=1的情况计算)可以扩展到这种情况:

    double averageReplacementCount = 0;
    for (int i = n; i < m; i++) {
        averageReplacementCount += 1.0 / (i + 1);
    }
    
    double averageReplacementCount=0;
    for(int i=n;i
    对于n=10000和m=2000000000,这仅为~12.206(<13!)

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


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

    您确定知道堆是什么吗?提示:假设您拥有目前为止看到的1000000个数字中的前10000个数。现在又来了一个号码。你将如何更新你的列表,以确保你拥有目前为止看到的1000001个前10000个?堆如何帮助您提高效率?保持结果列表的排序(或者更好的是,在堆中排序)将进一步改善运行时。@dimo414“集合”API中有吗?我找不到。如果20亿个数字是唯一的,可以使用SortedSet/TreeSet。Collections框架包括,它由堆支持,但没有边界。使用
    SortedSet
    可以很好地工作,或者实现一个简单的有界堆结构并不十分复杂。