你的分析是正确的;当 g 为偶数时,您可以将运行时间表示为 T(n) = T(n/g) + T(3n/4) + cn,这是您的简化表达式;无论 g 是偶数还是奇数,当 g > 4 时这是 O(n) 的归纳证明是相同的。
要了解为什么这个等式是正确的,最容易考虑的是如何导出具有奇数 g 的 T(n) 的表达式。我们可以假设我们的输入列表 A 没有重复元素,而不会失去一般性(通过稍微修改算法,或者将每个元素 A[i] 替换为元组 (A[i], i) 并使用字典比较) . 这使得分析更加容易。
现在,Median-of-Medians Quickselect 的运行时基于它所做的三件事:
- 在大小的“中位数”列表上递归调用自身
ceil(n/g)
以找到中位数的中位数 M
cn
对项目进行分组,围绕 划分列表M
,并找到每个 g 小组的中位数,以及
- 在所有元素小于
M
的分区、所有元素大于 的分区上递归调用自身M
,或者立即返回。
忽略 ceil 和一个附加O(1)
常数,这给出T(n) = T(n/g) + T(New Partition Size) + cn
. 新分区大小可以是多大?是max(# elements less than M, # elements greater than M)
。
奇怪的时候g
,我们有一半的n/g
组中位数小于M
(因此(g-1)/2
,加上1
中位数,该组中的元素小于M
),一半的中位数大于M
(再次,为每个这样的元素给出(g+1)/2
“大于”M
团体)。
由于您将偶数列表的中位数定义为两个中间元素的算术平均值,因此这变得更加简单:一半的n/g
组的中位数小于M
,并且每个此类组的恰好一半的元素小于其中位数,因此小于M
; 相同的逻辑适用于大于。这意味着我们已经消除了至少 ( half of n/g times g/2
) 或n/4
元素,留下3n/4
了最大的新分区大小和T(n) = T(n/g) + T(3n/4) + cn
.