问题(平面点集的凸包) 给定大量离散点的集合Q,求一个最小的凸多边形,使得Q中的点在该多边形内或者边上。
就是说多边形中的任意的两点的连线,依然要在集合里面
应用背景
图形处理中用于形状识别:字形识别、碰撞检测等
一、分治算法
-
以连接最大纵坐标点 ymax 和最小纵坐标点 ymin 的线段d={ymax,ymin}划
分L 为左点集 Lleft 和右点集 Lright -
Deal (Lleft );Deal (Lright )
考虑 Lleft:确定距d 最远的点P
在三角形内的点,删除;
a 外的点与 a 构成 Lleft 的子问题;
b 外的点与 b 构成 Lleft 的子问题 .
二、伪码
Deal ( Lleft )
# 1. 以 d 和距离 d 最远点 P 构成三角
形,P加入凸包,另外两条边分别记
作 a 和 b
# 2. 检查 Lleft 中其他点是否在三角形
内;在则从 L中删除;否则根据在 a
或 b 边的外侧划分在两个子问题中
3.Deal (a)
4.Deal (b)
三、算法分析
- 初始用d 划分 O(n)
- Deal 递归调用 W(n)
–找凸包顶点 P O(n)
–根据点的位置划分子问题 O(n)
- W(n) = W(n-1) + O(n)
W(3) = O(1)
最坏情况为O(n2)
最坏情况为O(n2)
T(n) = O(n) + W(n) = O(n2) - Graham扫描算法 O (nlogn)
四、总结
- 将原问题归约为子问题
直接划分注意尽量均衡
通过计算归约为特殊的子问题
子问题与原问题具有相同的性质
子问题之间独立计算 - 算法实现
递归或迭代实现
注意递归执行的边界