Median of medians
方法在quicksort
类型的分区算法中非常流行,可以产生相当好的透视图,从而对阵列进行统一的分区。其逻辑在维基百科中给出为:
所选的枢轴小于或大于中值列表中元素的一半,每一半大约有n/10个元素(1/2*(n/5))。这些元素中的每一个都是5的中值,使其小于块外的2个其他元素,大于块外的两个其他元素。因此,枢轴在块外部小于3(n/10)个元件,并且在块外部大于另外3(n/0)个元件。因此,所选择的中值将元素分割在30%/70%和70%/30%之间的某个位置,这确保了算法的最坏情况下的线性行为。
有人能为我解释清楚一点吗?我发现很难理解其中的逻辑。
想想下面的一组数字:
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个数字(它们本身小于k
)。这意味着,对于m
大于其中值的那些较小的5个元素组中的每一个,m
也大于其他两个数字。这使得它在这些n / 10
小5元素组中的每一个中至少有3个数字(2个数字+中值本身),这些数字小于m
。因此,m
至少比3n/10
的数字大。
对于元件数量CCD_ 22的类似逻辑大于。