推广中位数算法的中位数
Posted
技术标签:
【中文标题】推广中位数算法的中位数【英文标题】:Generalizing the median of medians algorithm 【发布时间】:2021-11-14 15:22:47 【问题描述】:有人问我找中位数算法的中位数为尺寸G组的一般形式的运行时间。它从常见的实例似乎g=3,5,7
与T(n)=T(n/5)+T(2n/3)+cn
,T(n)=T(n/5)+T(7n/10)+cn
和T(n)=T(n/7)+T(5n/7)+cn
分别T(n)=T(n/g)+T(1-(n/(2g)*(g+1)/2))+cn
P>的是,一般为奇数。将
不过,我用什么来作为中间使用偶数号g的中位数将两个元素,而不是实际的set本身之间存在着挣扎。有人告诉我,我可以忽略地板和天花板。直觉告诉我,它应该简单地T(n)=T(n/g)+T(1-(n/(2g)*(g)/2))+cn
,但我不禁觉得我失去了一些东西。 P>
这是怎样的算法可能与偶数的小组进行讨论谁能给建议?我想我应该能找到的运行时间,一旦我理解该算法。 P>
【问题讨论】:
【参考方案1】:你的分析是正确的;当 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
作为中位数,该组中的元素小于@987654335 @),一半的中位数大于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
。
【讨论】:
以上是关于推广中位数算法的中位数的主要内容,如果未能解决你的问题,请参考以下文章