形式陈述
接口与三路划分
输入是长度 n ≥ 1 的数组 理路 数组 Array 以连续整数下标支持随机访问的有限序列结构。 A 与整数秩 1 ≤ k ≤ n ,输出它的第 k 个顺序统计量 理路 顺序统计量 Order statistic 有限样本按键排序后第 k 个位置的值,保留重复出现的次数。 。键来自全序集合,重复值按出现次数保留;关键字比较、常数大小记录的交换与数组访问都按常数计费。
选一个实际存在的枢轴值 p ,用线性扫描把当前数组划为小于、等于、大于 p 的三块 L , E , G ,记其长度为 ℓ , e , g 。因为 e ≥ 1 ,下面的分支既保持目标值,也保证规模下降:
k ≤ ℓ 时,在 L 中继续找第 k 小;
ℓ < k ≤ ℓ + e 时,返回 p ;
k > ℓ + e 时,在 G 中继续找第 k − ℓ − e 小。
它沿用分治 理路 分治法 Divide and conquer 把问题分成较小同类子问题,递归求解后合并结果的算法设计范式。 的划分与递归结构,但确定枢轴后,只保留目标秩所在的一侧。这里的相等块有一段秩区间,不能给所有同键记录强行指定同一个唯一排名。
随机 Quickselect
每轮从当前子数组的元素位置中独立均匀选取枢轴,再执行上述划分。对每个固定输入,其期望时间为 O ( n ) ;互异键上若持续选择极端枢轴,仍可能花 Θ ( n 2 ) 时间。
线性期望来自足够频繁的有效缩小:按某个固定规则给重复出现的位置打破并列,处于中间一半秩附近的枢轴以固定正概率被选中;一旦命中,任何仍需处理的严格小于或严格大于块至多约为原规模的 3 / 4 。每个尺度等待这样的成功只需常数期望轮数,而该尺度内每轮扫描长度都不超过当前上界。把各尺度工作相加,得到 O ( n + ( 3 / 4 ) n + ( 3 / 4 ) 2 n + ⋯ ) = O ( n ) 。相等块提前返回只会减少工作。
五元素分组的确定性选择
Median-of-medians 把元素分成 ⌈ n / 5 ⌉ 组,每组至多五项;在每组内直接找中位数,再递归选出这些组中位数的一个中位数 p 。以 p 三路划分后,只递归目标所在的严格一侧。
在中位数不小于 p 的完整组中,至少三项不小于 p ;另一侧对称。为容纳最后一个短组及枢轴所在组,保守扣除两个组后,每侧仍有至少 3 n / 10 − O ( 1 ) 项可用于排除。因此,对充分大的规模,最坏时间满足
T ( n ) ≤ T ( ⌈ n / 5 ⌉ ) + T ( ⌊ 7 n / 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 个元素的集合,却没有把它们内部排好。分位数和截尾统计也可以复用这个秩接口;多次求秩时,还应重新比较反复选择、复用划分与一次完整排序的总成本。
动态插删由顺序统计树 理路 顺序统计树 order-statistic tree · dynamic order statistics 在平衡搜索树中维护子树大小,动态支持按秩选择与键的秩查询。 维护大小摘要,流式受限空间则可采用分位数摘要 理路 流式分位数摘要 streaming quantiles · quantile sketch 在单遍小空间中返回秩误差受控的近似分位数,而非数值距离近似。 并报告秩误差。这些是不同更新和误差接口。随机增量构造 理路 随机增量构造 randomized incremental construction · RIC 按随机排列插入对象,以冲突关系和反向分析控制几何结构的期望构建成本。 逐项加入并维护全局结构,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。