Skip to content

算法Algorithm

选择算法

施工中 · 内容逐步修订

Selection algorithm

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

形式陈述 ​

接口与三路划分 ​

输入是长度 n≥1 的数组 A 与整数秩 1≤k≤n,输出它的第 k 个顺序统计量。键来自全序集合,重复值按出现次数保留;关键字比较、常数大小记录的交换与数组访问都按常数计费。

选一个实际存在的枢轴值 p,用线性扫描把当前数组划为小于、等于、大于 p 的三块 L,E,G,记其长度为 ℓ,e,g。因为 e≥1,下面的分支既保持目标值,也保证规模下降:

  • k≤ℓ 时,在 L 中继续找第 k 小;
  • ℓ<k≤ℓ+e 时,返回 p;
  • k>ℓ+e 时,在 G 中继续找第 k−ℓ−e 小。

它沿用分治的划分与递归结构,但确定枢轴后,只保留目标秩所在的一侧。这里的相等块有一段秩区间,不能给所有同键记录强行指定同一个唯一排名。

随机 Quickselect ​

每轮从当前子数组的元素位置中独立均匀选取枢轴,再执行上述划分。对每个固定输入,其期望时间为 O(n);互异键上若持续选择极端枢轴,仍可能花 Θ(n2) 时间。

线性期望来自足够频繁的有效缩小:按某个固定规则给重复出现的位置打破并列,处于中间一半秩附近的枢轴以固定正概率被选中;一旦命中,任何仍需处理的严格小于或严格大于块至多约为原规模的 3/4。每个尺度等待这样的成功只需常数期望轮数,而该尺度内每轮扫描长度都不超过当前上界。把各尺度工作相加,得到 O(n+(3/4)n+(3/4)2n+⋯)=O(n)。相等块提前返回只会减少工作。

五元素分组的确定性选择 ​

Median-of-medians 把元素分成 ⌈n/5⌉ 组,每组至多五项;在每组内直接找中位数,再递归选出这些组中位数的一个中位数 p。以 p 三路划分后,只递归目标所在的严格一侧。

在中位数不小于 p 的完整组中,至少三项不小于 p;另一侧对称。为容纳最后一个短组及枢轴所在组,保守扣除两个组后,每侧仍有至少 3n/10−O(1) 项可用于排除。因此,对充分大的规模,最坏时间满足

T(n)≤T(⌈n/5⌉)+T(⌊7n/10+6⌋)+O(n).

小规模直接求解。两个递归规模的主系数之和为 1/5+7/10=9/10<1,用线性猜测归纳并吸收固定取整误差,可得确定性最坏 O(n)。保证说的是非严格两侧各有许多项;三路划分让重复键也符合这个丢弃论证。

直觉

完整排序确定所有秩之间的相对次序,选择只确定一个目标位置。划分已经说明目标在何处后,另一侧的内部次序就与答案无关。不同枢轴策略控制的是每次还能丢掉多少:随机选择给平均进度,组中位数则强制每次保留的最大比例。

“只递归一边”本身还不保证线性。如果每次只丢一个元素,扫描账本依旧是 n+(n−1)+⋯。真正的分析要把枢轴质量与整条递归规模序列联系起来。

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

数组 [7,1,5,2,4] 求第 3 小。取枢轴 4 后,小于块是 [1,2],相等块只有 4,目标正好落在其中。无需排好 [5,7] 即可返回。图中对同一输入改求第 4 小,因此保留大于块 [7,5],并把目标改成其中第 1 小。

再取 [7,1,5,2,2],以 2 划分得到长度 ℓ=1,e=2,g=2。第 2、第 3 小都直接返回 2;第 4 小则转成在 [7,5] 中求第 1 小。全相等输入一轮扫描即可完成,而不是继续处理一串大小仅减一的子数组。

若允许输入为空或秩越界,接口应先报告非法请求。要返回具体记录而非键值,还需约定同键身份的选择规则。

采用原地三路划分时,Quickselect 的目标侧递归可以改成循环,只保留常数个边界和秩变量,使用 O(1) 额外空间。确定性分组版本可把组中位数搬到数组前缀,避免另开线性数组;其枢轴递归和目标侧递归的栈深为 O(log⁡(n+1))。使用新数组收集各块的实现则需要另报分配与空间成本。

推论与应用

在纯比较模型中,选择也有线性下界。正确执行的比较图必须把选中元素与其他元素都约束起来;若存在与它完全断开的比较连通分量,可把该分量的全部值移到它的上方或下方而保留所有既有比较,改变选中元素的秩。因此比较图必须连通,至少有 n−1 条比较边。该论证针对互异键的最坏输入,足以与线性选择上界匹配。

一次选择可确定 top-k 的阈值,再扫描收集阈值一侧,并从相等块补足所需数量。这给出恰好 k 个元素的集合,却没有把它们内部排好。分位数和截尾统计也可以复用这个秩接口;多次求秩时,还应重新比较反复选择、复用划分与一次完整排序的总成本。

动态插删由顺序统计树维护大小摘要,流式受限空间则可采用分位数摘要并报告秩误差。这些是不同更新和误差接口。随机增量构造逐项加入并维护全局结构,Quickselect 则不断缩小一个秩子问题,两者需要各自的期望分析。

参考资料
  • Jeff Erickson, Algorithms, Chapter 1: Recursion, 2019,Selection 与 median-of-medians 小节。
  • Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest、Clifford Stein,Introduction to Algorithms, 4th ed., MIT Press, 2022,§§9.2–9.3。
  • Manuel Blum、Robert W. Floyd、Vaughan Pratt、Ronald L. Rivest、Robert E. Tarjan,“Time Bounds for Selection,” Journal of Computer and System Sciences 7(4), 1973,pp. 448–461。
关系图谱8 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

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

使用的工具

被这些条目使用

实现的抽象