推广中位数算法的中位数

Posted

技术标签:

【中文标题】推广中位数算法的中位数【英文标题】:Generalizing the median of medians algorithm 【发布时间】:2021-11-14 15:22:47 【问题描述】:

有人问我找中位数算法的中位数为尺寸G组的一般形式的运行时间。它从常见的实例似乎g=3,5,7T(n)=T(n/5)+T(2n/3)+cnT(n)=T(n/5)+T(7n/10)+cnT(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

【讨论】:

以上是关于推广中位数算法的中位数的主要内容,如果未能解决你的问题,请参考以下文章

中位数算法的中位数解释

《算法进阶50讲》中位数

数据结构算法之求中位数

算法设计5——找中位数算法

算法导论 中位数和顺序统计量(python)

理解“两个排序数组的中位数”的算法