zoukankan      html  css  js  c++  java
  • 最小圆覆盖

    提交:洛谷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))

    证毕.

  • 相关阅读:
    php的命名空间层级与目录层级是一致的吗?
    PHP 反射应用之一(插件框架)
    一次http完整的请求tcp报文分析
    Restful based service 的跨域调用
    php 命名空间的目的
    浏览器跨域问题
    PHP 代码跟踪
    记一次分析别人源码的过程
    php script 的生命周期
    全局安装 vue
  • 原文地址:https://www.cnblogs.com/Mychael/p/8672822.html
Copyright © 2011-2022 走看看