分治算法----凸包

本文介绍如何利用分治算法求解凸包问题。首先连接最左端和最右端的点,定义上包和下包,接着寻找与直线距离最远的点,不断划分并递归,直至包的节点数小于等于1,每次递归添加新的顶点到顶点集合。

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

凸包是正好包含所有点的凸边形,之所以叫凸包,是因为凸中包含了凸多边形包围起来的所有点

我们要写的是找出凸包的顶点集,使用分治算法

首先,连接最左端和最右端的两点。命名线上方的区域为上包,下方位下包,将两点加入到顶点集合

然后,找到与直线距离最远的两点,与第一步中的两点相连,划分为上包和下包,新找出的两点为新的顶点加入到顶点集合

在此之后,上包递归分为上下两个子包,下包地柜分为两个子包,知道包节点数小于等于1,每次递归都要将新的顶点加入到顶点集。

分治的思路是每一次递归找到一个顶点,把剩余的顶点交给子问题,有子包去解决

from math import sqrt

solution = []         # 顶点集


def convex_hull(points):
    # 凸包算法   
    # 长度小于=3   三角形
    if len(points) <= 3:
        return points
    # 声明全局变量
    global solution
    # x坐标排序
    points.sort(key=lambda x: x[0])
    # 左边最远值
    left_most = points[0]
    # 右边最远值
    right_most = points[- 1]        
    # 将左边右边最远值分别加入到顶点集合的后面    extend拆分添加
    solution.extend([left_most, right_most])
    # 分治  True为上包  FALSE为下包
    helper(points, left_most, right_most, True)
    helper(points, left_most, right_most, False)
    return solution


def helper(points, left_most, right_most, upBool):
    """
    利用line_helper计算lef
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值