平面点集的凸包问题的算法分析

问题(平面点集的凸包) 给定大量离散点的集合Q,求一个最小的凸多边形,使得Q中的点在该多边形内或者边上。
convex

就是说多边形中的任意的两点的连线,依然要在集合里面

应用背景
图形处理中用于形状识别:字形识别、碰撞检测等

一、分治算法

  1. 以连接最大纵坐标点 ymax 和最小纵坐标点 ymin 的线段d={ymax,ymin}划
    分L 为左点集 Lleft 和右点集 Lright

  2. 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)

四、总结

  • 将原问题归约为子问题
    直接划分注意尽量均衡
    通过计算归约为特殊的子问题
    子问题与原问题具有相同的性质
    子问题之间独立计算
  • 算法实现
    递归或迭代实现
    注意递归执行的边界

猜你喜欢

转载自blog.csdn.net/Prototype___/article/details/124052588