在线性时间内准备数组以找到O(k)中的k个最小元素

Ida*_*dan 23 sorting algorithm big-o

这是我在网上发现的一个有趣的问题.给定一个包含n数字的数组(没有关于它们的信息),我们应该在线性时间内预处理数组,这样我们就可以及时返回k最小的元素O(k),当我们给出一个数字时1 <= k <= n

我和一些朋友一直在讨论这个问题,但没有人能找到解决方案; 任何帮助,将不胜感激!

Kar*_*ath 14

对于预处理步骤,我们将在同一数据集上多次使用基于分区的选择.

使用算法找到第n/2个数字.现在,数据集被分为两个部分,下部和上部.在下半部再次找到中点.在它的下部分区做同样的事情等等......总的来说,这是O(n)+ O(n/2)+ O(n/4)+ ... = O(n).

现在,当您必须返回k个最小元素时,搜索最近的x < k,其中x是分区边界.它下面的所有东西都可以返回,从下一个分区你必须返回k - x数字.由于下一个分区的大小为O(k),因此为第k个x数字运行另一个选择算法将返回其余分区.

  • 我觉得这很不直观.即使您必须以相同的速度检索所有元素,您也会对更早的元素进行更多预处理.基本上,你正在利用早期元素可以"支付"以检索后来元素的事实.例如,如果k = n/2 + 1,获得前n/2个元素需要~n/2次,但获取最后一个元素也需要~n/2次.但那没关系,因为2·n/2仍然是O(n/2 + 1). (2认同)
  • @svick:我认为在某种程度上它是直观的.如果k足够大(如在你的例子中,> n/2),你甚至不需要预处理,因为选择算法将在O(k)中完成.随着k越来越小,对预处理的需求越来越大,以确保您只需要检查少数元素. (2认同)