最小圆覆盖
给定(n)个二维平面上的点,求一个面积最小的圆,可以覆盖所有点。
常见的是增量法实现的时间复杂度与空间复杂度均为(O(n))的算法。
用(C_i)表示前(i)个点组成的最小圆。
- 将所有点随机排序。
- 按照顺序依次加入点,每次加入(i_{th})点时进入操作3。
- 如果当前点(i)已经在圆(C_{i-1})内部,那么(C_i = C_{i-1}),进入操作2,否则操作4。
- 固定(i)为圆心,每次去找(j(1 leq j < i))是否在(C_i)外,如果是,则以(i,j)为直径重新作圆。进入操作5。
- 枚举点(k)是否满足(k)在(C_i)外,如果是,那么以(i,j,k)为圆边界作圆。
上面这个算法以第一步为基础,要求顺序必须是随机的,否则复杂度会高达(O(n^3))。
我认为其实上面的做法和计算树的直径算法很相似。
树的直径:树上相距最远两点的距离。
- 随机找一个根节点,将其设为root。
- 从root搜索相距最远的点(i),即(i = argmax _j dis(j, root))。
- 从(i)搜索相距最远的点(k),即(k=argmax_j dis(j, i))。
- 直径为(dis(i,k))。