求第 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\) 代入发现等式成立,于是该做法复杂度最坏也为线性。
(也许可以出成交互然后交互库是依赖性的,这样随机做法就炸了)