You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

推导中位数的中位数算法时间复杂度为O(nlogn),错在哪里?

中位数的中位数算法时间复杂度推导错误解析

你给出的推导存在两个核心错误,导致得出了错误的O(nlogn)结论:

1. 完全遗漏了算法的核心递归步骤

中位数的中位数算法的完整流程不仅包含递归寻找中位数的中位数,还包含以下关键步骤,你完全没纳入时间复杂度计算:

  • 将原数组划分为5个元素一组后,每组排序找中位数的时间:虽然单个5元素组排序是O(1),但n/5个组的总耗时是O(n)
  • 用找到的中位数的中位数作为pivot,对原数组进行划分的时间:这部分是O(n)
  • 划分完成后,递归处理目标元素所在的子数组的时间:这部分的子数组大小最多是7n/10,对应的递归项是T(7n/10)

你只计算了寻找中位数的中位数的递归链(T(n/5) + T(n/25) + ...),完全漏掉了上述O(n)和T(7n/10)的核心部分,这是最致命的错误。

2. 等比数列求和的逻辑错误

即使只看你计算的递归链部分,你的累加逻辑也错了:
你把每一项n/5^k * O(1)当成了O(n),然后认为有ceil(log5(n))个O(n)项,得出O(nlogn)。但实际上:
n/5 + n/25 + n/125 + ... 是一个首项为n/5、公比为1/5的无穷等比数列,求和结果为:

n/5 / (1 - 1/5) = n/4

这部分的总时间是O(n),而非O(nlogn)——因为等比数列的和收敛到原数组大小的常数倍,不会随着递归层数线性累加出logn的因子。

正确的递归式与结论

中位数的中位数算法的正确递归式是:

T(n) = T(n/5) + T(7n/10) + O(n)

用代入法或主定理可以证明,这个递归式的解是T(n) = O(n),这也是该算法能在线性时间内找到第k大元素的原因。

内容的提问来源于stack exchange,提问作者boban dogan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 12:25:25