中位数算法的中位数解释
Posted
技术标签:
【中文标题】中位数算法的中位数解释【英文标题】:Explanation of the Median of Medians algorithm 【发布时间】:2012-09-14 18:39:22 【问题描述】:Median of medians
方法在quicksort
类型的分区算法中非常流行,以产生相当好的枢轴,这样它就可以均匀地对数组进行分区。其逻辑在***中给出为:
所选的枢轴小于和大于中位数列表中元素的一半,每半数大约是 n/10 个元素 (1/2 * (n/5))。这些元素中的每一个都是 5 的中位数,使其小于块外的 2 个其他元素和大于 2 个其他元素。因此,主元小于块外的 3(n/10) 个元素,大于块外的另外 3(n/10) 个元素。因此,选择的中位数将元素拆分为 30%/70% 和 70%/30% 之间的某个位置,这确保了算法在最坏情况下的线性行为。
谁能给我解释清楚一点。我发现很难理解其中的逻辑。
【问题讨论】:
【参考方案1】:想想以下一组数字:
5 2 6 3 1
这些数字的中位数是3
。现在如果你有一个数字n
,如果n > 3
,那么它至少比上面的数字大一半。如果n < 3
,则至少小于上述数字的一半。
这就是想法。也就是说,对于每组 5 个数字,你得到他们的中位数。现在你有n / 5
号码。这很明显。
现在,如果您得到这些数字的中位数(称为m
),它会大于其中一半,小于另一半(根据中位数的定义!)。换句话说,m
大于 n / 10
数字(它们本身是 5 个小元素组的中位数)并且大于另一个 n / 10
数字(同样是 5 个小元素组的中位数)。
在上面的例子中,我们看到如果中位数是k
而你有m > k
,那么m
也大于其他两个数字(它们本身小于k
)。这意味着对于m
大于其中值的那些较小的 5 个元素组中的每一个,m
也大于其他两个数字。这使得在每个n / 10
小的 5 个元素组中至少有 3 个数字(2 个数字 + 中位数本身),它们小于 m
。因此,m
至少大于 3n/10
数字。
元素个数m
大于类似的逻辑。
【讨论】:
再问一个问题,这个方法怎么保证这个数字是中位数呢?中位数是将数组划分为上半部分和下半部分的数字。那么这个 30-30-70 的数字意味着什么? 嗯,中位数在中间,但是m
(在上面的文字中)并不是所有数字的中位数。它只是 1/5 数字的中位数(它们本身就是较小的 5 个元素组的中位数)。试着用更多的注意力阅读最后一段。最后,得出的结论是m
至少大于数字中的3n/10
,也就是说m
大于至少30% 的数字。所以最后,它就像m
至少大于 30% 并且小于至少另外 30%。还有 40% 我们不确定。
那么它为什么平均给出 50-50 个分区? 50-50分区是由正常中位数给出的,对吧?
它平均不给50-50
分区。它总是在30-70
和70-30
之间给出某个值(也许你可以平均称之为50-50
?),但这不是重点。为了让快速排序给O(nlogn)
时间复杂度,它需要能够将数组划分为与数组大小成比例的分区。这就是logn
递归深度的原因。 30-70
除法已经给出了与n
成比例的3n/10
和7n/10
除法。所以即使它不是一个完美的50-50
,它仍然会产生对数递归深度(除了它不是基数为2的log
,而是基数10/7
)以上是关于中位数算法的中位数解释的主要内容,如果未能解决你的问题,请参考以下文章
数据结构与算法之寻找两个正序数组的中位数的求解思路和算法示例
4. 寻找两个正序数组的中位数(LeetCode力扣算法 - java / rust)
4. 寻找两个正序数组的中位数(LeetCode力扣算法 - java / rust)