分治法解决计算凸包问题

这篇博客介绍了如何运用分治法解决计算凸包问题。从清华大学邓俊辉老师课程中的极点法和极边法出发,指出这两种方法的时间复杂度较高。接着提出分治法的思想,通过逐个添加点并检查新点与已有点的关系来更新凸包,降低了时间复杂度至O(n^3)。虽然这种方法仍无法处理共线点的情况,但作为前两种方法的优化,提供了更高效的解决方案。
摘要由CSDN通过智能技术生成

清华大学的邓俊辉老师的<计算几何>公开课中,在计算凸包问题时会遇到极点法和极边法:

  1. 极点法是假设所有的点都是凸包上的点,然后根据In-triangle测试,把去除不是极点的点,时间复杂度是O(n^4);
  2. 为了解决时间复杂度太高问题,引入极边法,假设所有的边都不是凸包上的边,然后判断每一条边是否只有一侧有点,那么他就是凸包上的边.这个时间复杂度是O(n^3).
  3. 为了进一步降低时间复杂度,利用分治法,类似于插入排序.逐个的取点,若是极点,把它加入到集合中,每次加入一个新点,判断引入新的点,对于已经存在的点的前驱点和后继点是否是前驱点在新插入点与当前点的右侧,后继点在右侧,说明这个当前点还是凸包上的点,若是反着的顺序,则,在插入新的点后,当前的点就不是凸包上的点了.这里实际上存在两种情况,若新插入的点,在已经存在的点构成的多边形内部,则所有的点都是RL模式,否则,必然存在LR模式,也存在两个分界点.在具体实现的时候,还会遇到在线上的点,这种确实很头疼.暂时用这种方法很难解决.

前两种方法在前面的一个文章实现了,比较简单,这里实现第三种方法,增量计算凸包,但是不能处理多个点共线问题.

#include <iostream>
#include <vector>
#include <unordered_map>

using namespace std;

struct point
{
    point(
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值