为什么中位数算法算法被描述为使用O(1)辅助空间?

时间:2016-01-02 03:17:51

标签: algorithm recursion space-complexity median-of-medians

Wikipedia lists the median-of-medians algorithm as requiring O(1) auxiliary space.

然而,在算法的中间,我们对大小为n/5的子数组进行递归调用,以找到中位数的中位数。当这个递归调用返回时,我们使用返回的中位数中位数作为分区数组的轴。

这个算法不会将O(lg n)激活记录作为递归的一部分推送到运行时堆栈吗?从我所看到的,这些递归调用以找到连续的中位数中位数不能被尾调用优化,因为我们在递归调用返回后做了额外的工作。因此,似乎这个算法需要O(lg n)辅助空间(就像Quicksort一样,由于运行时堆栈使用的空间,维基百科列为需要O(lg n)辅助空间。)

我错过了什么,或维基百科的文章是错误的?

(注意:我在维基百科页面上引用的递归调用是return select(list, left, left + ceil((right - left) / 5) - 1, left + (right - left)/10)。)

2 个答案:

答案 0 :(得分:10)

虽然我不能排除O(1)是可能的,但维基百科的信息似乎是错误的。

  • 这里显示的实现需要O(log n)而不仅仅是O(1)。
  • 如何用O(1)实现它并不明显,并且没有解释/参考。
  • 我问作者originally added that informationhe replied他不记得了,这可能是个错误。
  • A paper from 2005致力于用O(n)时间和O(1)额外空间解决选择问题,说BFPRT(中位数中位数)使用Θ(log n)额外空间。另一方面,论文的主要结果是O(n)时间和O(1)额外空间是可能的,并且作为证明的两种算法之一是BFPRT的一些“仿真”。所以在这个意义上它是可能的,但我认为仿真相当于使它成为一种不同的算法而且O(1)不应归因于“常规”BFPRT。至少不是没有解释 (感谢Yu-HanLyu在评论中展示了这篇论文及其他内容)

答案 1 :(得分:-1)

是O(1)。

让我们假设我们从一个长度为n的数组开始,我们打算找到排序列表的第k个元素。

在第一次调用中位数后,中位数会吐出一个较小的数组,现在我们需要计算这个较小数组的第i个元素。请注意,这个较小数组的第i个元素是结果,所以我不需要将任何信息传回给先前的调用。

在快速排序中,我需要将已排序的小数组放回正确的位置,以便进行递归。中位数为中位数,在循环(尾递归)之后,我将留下答案。

递归深度= O(1)