凸包问题的分治算法及python实现

本文介绍了一种利用分治思想处理凸包问题的方法。首先按横坐标排序点集,选取横纵坐标最小的点进行划分,递归求解子集的凸包。在递归过程中,找到使面积最大的点,该点位于凸包上。最后通过合并子凸包得到整个凸包。实验证明,分治算法在大规模数据集下仍能保持毫秒级别的运行时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


利用分治思想处理凸包问题。
划分:将点集S中的数据按横坐标排序,选出横坐标最小的点A和纵坐标最小的点B,AB的连线将S划分为两个子集,位于(AB) 上方的集合S1和位于(BA) 上方的集合S2。

递归求解:递归调用算法求S1的凸包和S2的凸包,递归算法中找出S1中使∆ABC面积最大的点C,则点C一定位于S1的凸包上,继续以点AC和CB作为连线划分S1。

合并:通过上述方法找到的凸包上的点直接合并,最后使用蛮力算法中的输出方法逆序输出点即可。


随机点集S生成部分与蛮力算法相同


分治算法中递归部分代码如下:


def dealleft(first,final,lis,temp):
    #temp用来标记位于凸包上的点
    max=0
    index=-1
    #处理first到final的上方,得到使first,final,i 三点组成的三角形面积最大的点i
    if first<final:
        for i in range(first,final):
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值