算法札记:Andrew算法求凸包

学习斜率优化发现要用到凸包,一查发现国外管斜率优化叫凸包优化

‌**具体怎么求凸包?**‌

以最常见的‌求下凸壳 ‌为例(对应DP取min的情况),假设我们的决策点 x 坐标是单调递增的。

‌**核心思想:维护一个单调队列,保证队列中相邻两点连线的斜率是单调递增的。**‌

想象你在从左到右扫描这些点,手里拿着一根线,要把它绷紧在所有点的下方:

  1. 准备阶段 ‌:把所有决策点按 x 坐标从小到大排好序(如果DP过程本身就让 x 单调递增,那就不用额外排序了)。

  2. 逐个加入点 ‌:用一个栈或队列来维护凸包上的点。每加入一个新点 C,就检查它和栈顶两个点 AB 的关系。

  3. 判断凹点并剔除 ‌:计算 AB 连线的斜率 k1BC 连线的斜率 k2

    • 如果 k1 < k2,说明 B 是凸点,保留它,把 C 入栈。
    • 如果 k1 >= k2,说明 B 是凹点(或者共线),它不可能成为最优决策点,把 B 弹出栈,然后继续用新的栈顶两个点和 C 比较,直到满足 k1 < k2 为止。
  4. 重复‌:处理完所有点后,栈里剩下的点就是下凸壳上的点,按顺序排列。


用叉积来判断,避免除法精度问题

实际写代码时,我们一般不用真的算斜率(除法会有精度问题),而是用‌叉积‌来判断三个点的凹凸关系。

对于点 A(x1, y1)B(x2, y2)C(x3, y3),计算向量 ABBC 的叉积:

cross = (x2 - x1) * (y3 - y2) - (y2 - y1) * (x3 - x2)

  • 如果 cross > 0,说明 B 是凸点(下凸壳保留)。
  • 如果 cross <= 0,说明 B 是凹点或共线,应该弹出。

这就是Andrew算法求凸包的核心逻辑,在斜率优化DP里我们通常只维护下半部分凸壳。

相关推荐
辰烨chenye3 小时前
LeetCode Hot 100 题解 · 普通数组篇
算法·leetcode·职场和发展
hqyjzsb6 小时前
零 AI 项目经验,学 Python 转型 AI 的正确顺序是什么?
开发语言·人工智能·python·算法·职场和发展·数据挖掘·数据分析
辰烨chenye6 小时前
LeetCode Hot 100 题解 · 二分篇
java·算法·leetcode
微功夫信息技术6 小时前
分层多智能体强化学习驱动的非急救转运公平 - 效率统一调度系统研究与实践
人工智能·学习·算法·动态规划
sanjiaomao3337 小时前
从论文公式到Python实现:用单元测试校验滑动平均算法
python·算法·单元测试
乐迪信息7 小时前
如何通过AI防爆摄像机精准判断船舶超速?
大数据·人工智能·算法·安全·目标跟踪
大圣编蚕8 小时前
Java ByteArrayInputStream 详解:从入门到实战
java·开发语言·算法
小玮看世界9 小时前
[Python]OD算法在OD实际运用转化参考清单
开发语言·python·算法
黎阳之光9 小时前
数字孪生赋能全域水网,实现水资源管控与节水降碳双向提升
人工智能·物联网·算法·安全·数字孪生
随意起个昵称9 小时前
【BFS】冰面滑行
算法·宽度优先