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

    最小圆覆盖

    给定(n)个二维平面上的点,求一个面积最小的圆,可以覆盖所有点。

    常见的是增量法实现的时间复杂度与空间复杂度均为(O(n))的算法。

    (C_i)表示前(i)个点组成的最小圆。

    1. 将所有点随机排序。
    2. 按照顺序依次加入点,每次加入(i_{th})点时进入操作3。
    3. 如果当前点(i)已经在圆(C_{i-1})内部,那么(C_i = C_{i-1}),进入操作2,否则操作4。
    4. 固定(i)为圆心,每次去找(j(1 leq j < i))是否在(C_i)外,如果是,则以(i,j)为直径重新作圆。进入操作5。
    5. 枚举点(k)是否满足(k)(C_i)外,如果是,那么以(i,j,k)为圆边界作圆。

    上面这个算法以第一步为基础,要求顺序必须是随机的,否则复杂度会高达(O(n^3))


    我认为其实上面的做法和计算树的直径算法很相似。

    树的直径:树上相距最远两点的距离。

    1. 随机找一个根节点,将其设为root。
    2. 从root搜索相距最远的点(i),即(i = argmax _j dis(j, root))
    3. (i)搜索相距最远的点(k),即(k=argmax_j dis(j, i))
    4. 直径为(dis(i,k))
    一个人没有梦想,和咸鱼有什么区别!
  • 相关阅读:
    Nhibernate1
    控制反转(IoC)
    Windbg是windows平台上强大的调试器
    Java 7 语法新特性
    区间数据计算
    红黑树数据结构剖析
    .net下灰度模式图像
    如何配置Hyper-V的虚拟机通过主机网络上网 (NAT)
    产品落地
    poj-3898 Software Industry Revolution DP
  • 原文地址:https://www.cnblogs.com/TABball/p/12747674.html
Copyright © 2011-2022 走看看