算法 – 以线性时间准备数组,以在O(k)中找到k个最小元素

这是一个有趣的问题,我在网上找到。给定一个包含n个数字的数组(没有关于它们的信息),我们应该在线性时间内预处理数组,以便我们可以在O(k)时间内返回k个最小的元素,当我们给出一个数字1 = k <= n 我一直在和一些朋友讨论这个问题,但是没有人能找到解决办法;任何帮助将不胜感激!
最佳答案
对于预处理步骤,我们将在同一数据集上多次使用基于分区的选择。

使用算法找到第n / 2个数字。现在数据集被分为两个半部,下部和上部。在下半部再次找到中点。在其较低的分区上做同样的事情等等…总体而言,这是O(n)O(n / 2)O(n / 4)… = O(n)。

现在当你必须返回k个最小的元素时,搜索最近的x < k,其中x是分区边界。可以返回下面的所有内容,并从下一个分区返回k-x数字。由于下一个分区的大小是O(k),所以运行另外一个k-x个数的选择算法将返回其余部分。

转载注明原文:算法 – 以线性时间准备数组,以在O(k)中找到k个最小元素 - 代码日志