圆覆盖

最小圆覆盖

给定\(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 = arg\max _j dis(j, root)\)
  3. \(i\)搜索相距最远的点\(k\),即\(k=arg\max_j dis(j, i)\)
  4. 直径为\(dis(i,k)\)
posted @ 2020-04-21 20:44  TABball  阅读(196)  评论(0编辑  收藏  举报