当前位置: 首页 > news >正文

凸包构造算法—Graham 扫描法

1. 理论原理推导

核心思想

Graham 扫描法基于以下基本思想:

  • 极角排序:
    选取一个参考点(通常选择 y 坐标最小的点,若存在多个,则选 x 坐标最小的),将其他点按照与该参考点构成的极角进行升序排序。这样排序后的点序列沿参考点方向依次展开,便于后续的凸包构造。

  • 利用栈进行构造:
    从参考点开始,依次将排序后的点加入栈中。每加入一个新点,都检查当前栈顶的两个点与新点形成的转向:

    • 如果转向为左转(或者说逆时针转),说明当前点有可能是凸包的一部分,继续压入栈中;

    • 如果转向为右转(顺时针)或共线,说明栈顶点不满足凸包条件,需要弹出栈顶点。如此反复,直至满足左转条件,再将当前点压入栈中。

几何证明

  • 正确性证明:
    利用“循环不变量”思想,可以证明:

    • 在每一步,栈中保存的点构成部分凸包(即所有点均处于边界的外侧)。

    • 如果出现右转,则说明栈顶点处于内部,不可能在最终凸包上,将其删除。

    由此,通过反复修正转向,最终栈中剩下的点必然构成整个点集的凸包。

  • 关键性质:
    对于任何三个连续的点 P_{i-2}P_{i-1}P_i,如果构成右转,则 P_{i-1}  一定不在凸包边界上;如果总是保持左转,则整个路径是凸的。
    这一性质正是构造凸包的理论依据。


2. 时间复杂度推导

Graham 扫描法主要分为两个阶段:

  1. 极角排序阶段:

    • 对 n 个点按照极角排序,通常采用快速排序或归并排序,其时间复杂度为 O(nlog⁡n)。

  2. 扫描与构造阶段:

    • 利用栈对排序后的点进行扫描,判断每次转向是否为左转或右转。每个点最多入栈一次、出栈一次,故该阶段的时间复杂度为 O(n)。

综合时间复杂度:
主要耗时在排序阶段,故总体时间复杂度为O(nlog⁡n)


3. 算法步骤

步骤 1:选择参考点

  • 在所有点中选择 y 坐标最小的点作为参考点(若 y 坐标相同,则选择 x 坐标最小的点),记为 P_0

步骤 2:极角排序

  • P_0​ 为原点,计算所有其他点与 P_0 之间的极角。

  • 对所有点(除了 P_0)按照极角升序排序。

    • 注意:在极角相同的情况下,通常保留离 P_0 最近的点,或者按距离排序,确保排序结果有利于凸包构造。

步骤 3:初始化栈

  • P_0 以及排序后的前两个点依次压入栈中。

步骤 4:扫描构造凸包

  • 对于排序后的其余每个点 P_i​(从第 3 个点开始):

    1. 检查栈顶的两个点(记为 P_{top}​ 和 P_{next\_to\_top}​)与 P_i​ 构成的转向。

    2. 如果转向为右转(或共线不满足要求),则说明 P_{top} 不在凸包上,从栈中弹出该点。

    3. 重复上述检查,直到栈顶的两个点与 P_i​ 构成左转为止。

    4. P_i​ 压入栈中。

步骤 5:输出结果

  • 当所有点处理完毕后,栈中保存的点按顺序构成整个点集的凸包。


算法总结

  • 理论原理:
    通过选择参考点、极角排序以及利用栈检查转向,保证了每一次只保留凸包边界上的点。利用几何性质证明了只有左转时点才属于凸包,右转时弹出不符合条件的点。

  • 时间复杂度:
    排序阶段 O(nlog⁡n),扫描阶段 O(n) ,整体为 O(nlog⁡n) 。

  • 算法步骤:
    包含选择参考点、极角排序、栈初始化、扫描构造凸包以及输出结果等步骤,流程清晰且易于实现。

相关文章:

  • 怎么把wps中的word的批注全部删掉
  • ArgoCD 可观测性最佳实践
  • 查看npm安装了哪些全局依赖
  • [electron] electron の 快速尝试
  • 应用分享 | AWG技术突破:操控钻石氮空位色心,开启量子计算新篇章!
  • Window对象的常用属性和方法
  • Git Tag 详解:版本管理与实战指南
  • 【jvm】安全点
  • 顺序表入门
  • Docker学习--容器操作相关命令--docker export 命令
  • 太速科技-330-基于FMC接口的Kintex-7 XC7K325T PCIeX4 3U PXIe接口卡
  • vue-office 支持预览多种文件(docx、excel、pdf、pptx)预览的vue组件库
  • 《C++多线程下单例 “锁钥” 法则》
  • Fast-Poly-2024
  • GodWork 3D 7.24 GodWork AT 7.24天工三维实景三维建模软件
  • 技术与情感交织的一生 (四)
  • 树莓集团引领数字产业生态构建的新力量
  • 汇编学习之《指针寄存器大小端学习》
  • 题解:P8628 [蓝桥杯 2015 国 AC] 穿越雷区
  • [Lc5_dfs+floodfill] 岛屿的最大面积(传参) | 被围绕的区域 | 太平洋大西洋水流问题(双标记位传参)
  • 网站建设大数据/网站整体优化
  • 江苏省泰州市建设局官方网站/seo网络推广机构
  • 刷信誉网站制作/淘宝seo优化怎么做
  • 封开网站建设/在线网页制作工具
  • 海外兼职网站建设/百度客服电话人工服务热线
  • 网站备案信息保护/网页搭建