我不是在寻找上述问题的算法。我只想有人评论我的答案。
我在一次采访中被问到以下问题:
如何从大量数字中获取前 100 个数字(无法放入内存)
这就是我所说的:
将数字分成每批 1000 个。在“O(1)”时间内对每个批次进行排序。到目前为止,总时间为 O(n)。现在从第一批和第二批(在 O(1) 中)中获取第 100 个数字。从上面计算的数字和第三批中取出第一个 100,依此类推。这总共需要 O(n) - 所以它是一个 O(n) 算法。
面试官回答说分批1000个。不会花费 O(1) 时间,因此不会从一批中挑选出第 100 个,经过大量讨论后他说,他对算法花费 O(n) 时间没有问题,他只是有我的一个问题是对批次进行排序需要 O(1) 时间。
我的解释是 1000 不依赖于输入 (n)。不管 n 是多少,我都会批量生产 1000 个。如果你必须计算,排序需要 O(1000*log 1000)),这本质上是 O(1)。
如果您必须进行适当的计算,那将是
1000*log 1000 对一个批次进行排序排序 (n/1000) 这样的批次需要 1000 * log 1000 * n/1000 = O(n*log(1000)) 时间 = O(n) 时间
我也向我的很多朋友询问过这个问题,虽然他们同意我的观点,但只是部分同意。所以我不知道我的推理是否100%正确(即使99%正确也请批评)。
请记住,这篇文章并不是要回答上述问题。我已经在从一亿个数字中检索前 100 个数字中找到了更好的答案