最小圆覆盖

提交:洛谷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 + 3sum_{i=1}^{n - 1} frac{1}{i} * O(i,②)))
(O(n,②) = O(n - 1 + 2sum_{i=1}^{n - 1} frac{1}{i} * O(i,③)))
(O(n,③) = O(n))


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

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

证毕.

原文地址:https://www.cnblogs.com/Mychael/p/8672822.html