最小圆覆盖

提交:洛谷1742 & BZOJ1336 & BZOJ1337

算法流程##

将所有点随机打乱【这很重要】
之后分为三层:
①从头枚举点,维护最小圆
如果当前点在当前圆内,跳过
否则,执行操作②

②当前点既然在圆外,记为\(i\)号点,说明\(i\)号点一定是前\(i\)个点构成的最小圆的边界上的点,那么固定\(i\)号点为边界点,从头枚举点再构一次圆
当枚举到点\(j\)使得\(j\)在圆外时,执行③
枚举到\(i\)后,又维护好了一个最小圆,返回到①继续枚举

③同理,当前点\(i\)\(j\)同为前\(j\)个点和\(i\)构成的最小圆边界上的点,固定其为边界点,再次重头枚举点构圆
如果再次枚举到一个点\(k\)在圆外时,我们有了三个点,圆确定,不需要从头枚举
直至枚举到\(j\),包含\(i\)\(1\)\(j\)的最小圆确定

直至①枚举完,最小圆确定

复杂度分析##

直观来看,枚举分为三层,最坏是\(O(n^3)\)的,但是由于序列的随机性,期望直接达到\(O(n)\)

证明:

枚举到第\(i\)个点时,该点在前\(i\)个点最小圆上的概率为\(\frac{3}{i}\),因为三点确定一个圆
故时间复杂度
\(O(①) = O(n + 3\sum_{i=1}^{n - 1} \frac{1}{i} * O(i,②))\)
\(O(n,②) = O(n - 1 + 2\sum_{i=1}^{n - 1} \frac{1}{i} * O(i,③))\)
\(O(n,③) = O(n)\)


\(O(n,②) =O(n - 1 + 2\sum_{i=1}^{n - 1} \frac{1}{i} * O(i)) = O(n - 1 + 2 * O(n)) = O(n)\)
\(O(①) = O(n + 3\sum_{i=1}^{n - 1} \frac{1}{i} * O(i)) = O(n + 3 * O(n)) = O(n)\)

故总的复杂度\(O(n)\)

证毕.

posted @ 2018-03-29 22:12  Mychael  阅读(470)  评论(0编辑  收藏  举报