【问题标题】:Quick select with random pick index or with median of medians?使用随机选择指数或中位数快速选择?
【发布时间】:2021-06-11 23:50:42
【问题描述】:
为了避免快速选择的 O(n^2) 最坏情况,我知道 2 个选项:
-
随机选择一个枢轴索引
-
使用中位数的中位数 (MoM) 选择一个近似的中位数并以此为中心
当使用 MoM 和快速选择时,我们可以保证最坏情况 O(n)。当使用(1)时,我们不能保证最坏情况O(n),但是算法到O(n^2)的概率应该是极小的。 (2) 的间接成本远高于 (1),后者几乎不会增加额外的复杂性。
那么我们什么时候应该使用一个而不是另一个?
【问题讨论】:
标签:
sorting
median-of-medians
【解决方案1】:
正如您所指出的,中位数方法比快速选择慢,但具有更好的最坏情况运行时间。假设 quickselect 在每一步确实使用了一个随机选择的枢轴,您可以证明不仅预期的运行时间为 O(n),而且其运行时间超过 Θ(n log n) 的概率非常非常小(在大多数 1 / nk 用于常数 k 的任何选择)。所以从这个意义上说,如果您能够随机选择枢轴,那么快速选择可能会更快。
但是,并非所有快速选择的实现都对枢轴使用真正的随机性,有些使用确定性枢轴选择算法。不幸的是,这可能导致触发 Θ(n2) 最坏情况运行时的病态输入,如果您有对抗性选择的输入,这是一个问题。
两者之间的良好折衷是introselect。 introselect 背后的基本思想是使用带有确定性枢轴选择算法的快速选择。在算法运行时,它会跟踪选择枢轴的次数,而不会丢弃至少 30% 的输入数组。如果该数字超过某个阈值,它将停止使用随机枢轴选择并切换到中位数方法来选择一个好的枢轴,从而强制减小 30% 的大小。这种方法意味着,在快速选择快速减小输入大小的常见情况下,introselect 与快速选择基本相同,但记账开销很小。然而,在快速选择会降级为二次的情况下,introselect 停止并切换到最坏情况下的有效中位数方法,确保最坏情况下的运行时间为 O(n)。从本质上讲,这为您提供了两全其美的优势 - 平均速度很快,最坏的情况永远不会比 O(n) 更差。