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