这是我在网上找到的一个有趣的问题。给定一个包含 n
个数字的数组(没有关于它们的任何信息),我们应该在线性时间内对数组进行预处理,以便当我们获得数字 1 <= k <= n
时,我们可以在O(k)
的时间内返回 k
个最小元素。
我已经与一些朋友讨论了这个问题,但没有人能找到解决方案,任何帮助将不胜感激!
对于预处理步骤,我们将在同一数据集上多次使用基于分区的选择。
使用该算法找到第 n/2 个数字...现在将数据集划分为两半,下半部分和上半部分。在下半部分中再次找到中点。在其下半部分执行相同的操作,并且依此类推......总体而言这是 O(n) + O(n/2) + O(n/4) + ... = O(n)。
现在,当您需要返回前 k 小的元素时,请搜索最接近 k 的 x,其中 x 是分区边界。可以返回它以下的所有内容,并且从下一个分区您必须返回 k - x 个数字。由于下一个分区的大小为 O(k),因此运行另一个选择算法以获得 k - x 个数字将返回剩余数字。
2k
的缓冲区。k
个元素。这需要n/k
次查找中位数和分区步骤,每次使用传统的快速选择需要O(k)
的时间。这种方法只需要O(n)
的时间。O(k log k)
时间。总体而言,这种方法只需要O(n + k log k)
的时间和O(k)
的空间。k
。我甚至不理解这应该如何工作。 - Karoly Horvath
k = n
的情况,需要在没有任何预先信息的情况下以O(n)
的时间复杂度对数组进行排序。 - i Code 4 Food