我在概念上苦苦挣扎。
如何编写程序以查找大约20亿个列表中最高的10,000个数字?假设计算机只有足够的容量一次处理大约10,000个数字(在20亿个中)。排除程序本身的任何开销,假设我在主内存中有足够的空间来一次处理10,000个数字。
有人建议我使用堆来处理信息,但是当我无法一次对所有数字进行排序时,我没有看到如何执行此操作。
答案 0 :(得分: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)。
这使得结果列表的数据结构选择可能不重要,只要最小值被缓存并且可以在恒定时间内进行比较。