Skip to content

选择算法

Selection algorithm

在未排序序列中求第 k 小元素而无需完全排序的算法族。

条目类型
算法

形式陈述

选择算法在未排序数组中找第 k 小元素。Quickselect 以枢轴分区,只递归进入包含目标排名的一侧,随机枢轴给期望 O(n) 时间但最坏 O(n2)。Median-of-medians 把元素五个一组,递归选组中位数的中位数作枢轴,保证每次丢弃固定比例,递推 T(n)T(n/5)+T(7n/10)+O(n),从而最坏 O(n)。原地实现通常只需常数额外数组空间加递归栈。

直觉

选择算法只需找到第 k 小元素。partition 后枢轴的最终排名已知:目标在左就完全忽略右边,在右就忽略左边,因此每层只递归包含目标排名的一侧,另一侧可整体丢弃。随机 quickselect 期望线性;median-of-medians 用分组中位数保证枢轴不会太偏,从而得到最坏线性。它比完整排序少恢复了大量无关相对次序。

选择算法的分区与单侧递归
例子与边界

找中位数时,随机 Quickselect 在实践中常比保证线性的算法常数更小。若每次总选最小元素为枢轴,会退化为 n+(n1)+。重复元素需要三向分区或仔细定义“等于枢轴”的排名区间,否则可能不收缩。线性选择不产生完全有序数组;若随后需要所有排名,排序仍更合适。比较模型下选择有 Ω(n) 下界,因为至少要检查所有潜在极端元素。

数组 [7,1,5,2,4] 求第 3 小,取枢轴 4 分区后左侧有 1,2,枢轴排名正好为 3,可直接返回。若目标在左侧,只需继续处理左分区。

重复元素时最好三路分区为小于、等于、大于枢轴,目标落在等值段即可停止。朴素总取极端枢轴会退化为二次时间;median-of-medians 的线性保证依赖分组和递归规模分析,不是“先找精确中位数”。

推论与应用

数组全序分治构成静态选择框架。Quickselect 的期望 O(n) 针对随机枢轴和固定输入,median-of-medians 则给比较/RAM 模型下的确定性最坏 O(n);两者都计算一次快照中的顺序统计量

一次选择即可确定 top-k 的分界值,再在线性扫描中收集阈值一侧的元素;反复选择适当秩可求精确 quantile。中位数与截尾统计对少量极端值比均值稳健,因此选择算法也是鲁棒统计的基础原语,不过“找出 top-k 集合”不等于把这 k 个元素内部完全排序,重复值处还须规定是否恰好输出 k 个。

若元素会动态插删,顺序统计树O(n) 空间换取最坏 O(logn) 的更新和 rank/select。若数据只能顺序到达,数据流分位数以受限空间返回带秩误差的近似答案。随机增量构造同样随机排列输入,却在逐项加入时维护一个全局结构;它与 quickselect 每轮随机选枢轴的状态演化不同,不能共享一张期望复杂度表。

参考资料
  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, Introduction to Algorithms, 4th ed., MIT Press, 2022,Parts I–VI。
  • Donald E. Knuth, The Art of Computer Programming, Vol. 3: Sorting and Searching, 2nd ed., Addison-Wesley, 1998,Chs. 5–6。
关系图谱7 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系

使用的工具

实现的抽象