求第 K 大元素

问题:给定一个长度为 \(n\) 的数组,求第 \(k\) 大元素。

普通的 \(O(n)\) 随机分治应该广为人知,这里介绍一种确定性的 \(O(n)\) 做法。

我们考虑分治,每五个元素一组,我们 \(O(1)\) 求出每组五个元素的中位数,随后我们递归调用该做法,求出每一组中位数的中位数,记为 \(x\)

然后我们 \(O(n)\) 扫描求出 \(x\) 的排名,我们由中位数的偏序关系可以得到这个 \(x\) 的排名必然在 \(\frac{3}{10}n\sim \frac{7}{10}n\) 之间(中位数小于 \(x\) 的组中至少有三个数小于 \(x\),中位数比 \(x\) 大的也至少有三个数)。

然后我们根据 \(k\)\(x\) 的排名关系来舍弃 \(x\) 某一侧的元素,将剩下的数组递归。

复杂度分析可以得到递推式 \(T(n)=T(\frac{n}{5})+T(\frac{7}{10}n)+cn\),其中 \(c\) 是常数。

\(T(n)=10cn\) 代入发现等式成立,于是该做法复杂度最坏也为线性。

(也许可以出成交互然后交互库是依赖性的,这样随机做法就炸了)

posted @ 2022-01-08 11:14  夜螢光  阅读(88)  评论(0编辑  收藏  举报