快包算法(分治法求凸包问题)
- 过程
- 两个极端点,它们是最右最下点p和最左最上点q
- 有向直线pq将整个凸包划分为左凸包和右凸包
- 对左右凸包分别进行递归
- 递归过程:
- 设S1是严格在直线pq右边的点集
- 在S1中寻找距离pq最远的点,作为pq右边的一个极端点b
- 连接pb和qb
- 把pb右侧的点集记为A,qb右侧的点集记为B
- 对边pb和点集A以及边qb和点集B分别进行递归调用
- 递归过程:
- 依次连接凸包上的顶点,得点集S1的凸包(点集S的右凸包)
- 类似计算出S的左凸包从而得到整个点集的凸包
- 时间复杂度
- 最好,每次划分平衡,O(nlogn)
- 最坏,每次划分极端,O(n2)