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)
。)
答案 0 :(得分:10)
虽然我不能排除O(1)是可能的,但维基百科的信息似乎是错误的。
答案 1 :(得分:-1)
是O(1)。
让我们假设我们从一个长度为n的数组开始,我们打算找到排序列表的第k个元素。
在第一次调用中位数后,中位数会吐出一个较小的数组,现在我们需要计算这个较小数组的第i个元素。请注意,这个较小数组的第i个元素是结果,所以我不需要将任何信息传回给先前的调用。
在快速排序中,我需要将已排序的小数组放回正确的位置,以便进行递归。中位数为中位数,在循环(尾递归)之后,我将留下答案。
递归深度= O(1)