Median of medians
方法在quicksort
类型的分区算法中非常流行,可以产生一个相当不错的基准点,使得它可以将数组均匀地划分。其逻辑在维基百科中给出如下所示:
能否有人为我稍微解释一下?我发现很难理解这个逻辑。选择的基准点对于中位数列表中约n/10个元素(每半部分为1/2 * (n/5))都小于和大于一半的元素。其中每个元素都是5个中位数之一,因此它比块外的两个元素小,比另外两个元素大。因此,基准点小于块外的3(n/10)个元素,并且大于块外的另外3(n/10)个元素。因此,所选的中位数将元素分割在30%/70%和70%/30%之间,这保证了算法的最坏情况下具有线性行为。
m
不是所有数字的中位数。它只是其中 1/5 数字的中位数(它们本身是较小的 5 元素组的中位数)。请仔细阅读最后一段。最后得出结论,即m
大于至少3n/10
的数字,这意味着m
大于至少 30% 的数字。因此,最终结果是m
大于至少 30%,小于至少另外 30%。还有 40% 的数字我们不确定。 - Shahbaz50-50
的比例分割。它通常会在30-70
和70-30
之间进行分割(也许你可以将其称为平均50-50
?),但这不是重点。为了使快速排序的时间复杂度达到O(nlogn)
,它需要能够按照数组大小的比例划分数组。这才会产生logn
的递归深度。30-70
的分割已经给出了一个3n/10
和7n/10
的比例,与n
成比例。因此,即使它不是完美的50-50
,它仍然会产生对数级别的递归深度(只是它的对数底数不是2,而是10/7
)。 - Shahbaz