Median of medians
方法在quicksort
类型分区算法中非常流行,以产生相当好的数据透视,从而统一分区数组。其逻辑在维基百科中给出:
所选择的枢轴小于和大于中位数列表中元素的一半,每半个元素大约为n / 10个元素(1/2 *(n / 5))。这些元素中的每一个都是5的中值,使得它少于2个其他元素并且在块之外大于2个其他元素。因此,枢轴在块外部小于3(n / 10)个元素,并且大于块外的另外3个(n / 10)个元素。因此,所选择的中位数将元素分割在30%/ 70%和70%/ 30%之间,这可以确保算法的最坏情况线性行为。
有人可以清楚地为我解释一下。我发现很难理解逻辑。
答案 0 :(得分:14)
想想以下几组数字:
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
也大于其他2个数字(它们本身小于{{} 1}})。这意味着对于k
大于其中等的那些较小的5个元素组中的每一个,m
也比其他两个数字更大。这使得每个m
小5个元素组中至少有3个数字(2个数字+中位数本身),小于n / 10
。因此,m
至少大于m
个数字。
元素数量3n/10
的类似逻辑大于。
答案 1 :(得分:3)
在这里可以找到中位数 - 中位数算法来解释n中第k个最大整数的解释:http://cs.indstate.edu/~spitla/presentation.pdf