计算几何系列 —— 美妙的旋转卡壳算法~上

本文介绍了计算几何中的旋转卡壳算法,用于求解多边形直径、凸多边形宽度和最小/最大距离等问题,通过GrahamScan求凸包并利用叉积和单峰函数性质优化效率。

       本系列文章力求以简洁易懂的文字介绍计算几何中的基本概念,使读者快速入门,故不追求难度和深度,仅起到抛砖引玉的作用。

        不知不觉基础的计算几何就快讲完了,这次我再讲讲有关多边形以及凸包的各种小算法。(QAQ)

     1.旋转卡壳算法

       看到这个算法的时候第一反应是脑子卡壳叭,尤其是我们在做这道家喻户晓的模板题的时候:

             [USACO03FALL] Beauty Contest G /【模板】旋转卡壳 - 洛谷  

          旋转卡壳算法是用来干啥的呢?

        我们将一个多边形上任意两点间的距离的最大值定义为多边形的直径,那么我们如果直接枚举直径所在的两点, 显然太慢了。那么有一个O(n)的算法:旋转卡壳,计算时就像一对平行卡壳卡住凸包旋转而得名,可以说这个名字取得非常的形象,那么我们来看一下这道题目的思路历程:

    先抛出一个问题:

          在二维平面上给定n个点,求距离最远的两个点之间的距离是多少?

      看到这道题,大部分同学第一反应肯定是暴力——暴力枚举所有点对,然后求出最远的那一对相距的距离。这种方法当然没错,可是复杂度已经达到了O(n^2),当n是50000,100000,甚至1000000时,暴力就显得苍白无力。

      这时我们进一步思考,这个最远点对一定会出现在这些点集的凸包上,所以在这里我们在凸包上,使用复杂度低至O(n)的旋转卡壳算法进行求解。

     什么是平行卡壳?非常形象的说法就是卡住凸包的一对平行线,然后旋转卡壳就是让这对平行线旋转起来:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值