algorithm - 最大线性维度 2d 点集

标签 algorithm graphics geometry

给定一组有序的二维像素位置(相邻或相邻对角线)形成一条没有重复的完整路径,我如何确定周长为该组像素的多边形的最大线性维度? (其中 GLD 是集合中任意一对点的最大线性距离)

就我的目的而言,明显的 O(n^2) 解决方案对于数千点的数字可能不够快。是否有好的启发式或查找方法可以使时间复杂度更接近 O(n) 或 O(log(n))?

最佳答案

一个简单的方法是先找到点的凸包,这可以通过多种方式在 O(n log n) 时间内完成。 [我喜欢Graham scan (参见 animation ),但是 incremental算法也很受欢迎,others 也是如此。 , 虽然有些人需要 more time .]

然后你可以找到最远的一对(直径),方法是从凸包上的任意两点(比如 x 和 y)开始,顺时针移动 y 直到它离 x 最远,然后移动 x,再次移动 y,等等. 你可以证明这整个事情只需要 O(n) 时间(摊销)。所以它总共是 O(n log n)+O(n)=O(n log n),如果你使用礼品包装作为你的凸包算法,则可能是 O(nh)。这个想法叫做rotating calipers ,正如您提到的。

这里是 code by David Eppstein (计算几何研究员;另请参阅他的 Python Algorithms and Data Structures 以供将来引用)。

所有这些都不是很难编写代码(最多应该是一百行;在上面的 Python 代码中不到 50 行),但是在您这样做之前——您应该首先考虑您是否真的需要它。如果如您所说,您只有“数千个点”,那么在任何合理的编程语言中,简单的 O(n^2) 算法(比较所有对)将在不到一秒的时间内运行。即使有一百万点,也不应该超过一个小时。 :-)

您应该选择有效的最简单算法。

关于algorithm - 最大线性维度 2d 点集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/321989/

相关文章:

java - 通过 vector 列表查找路径

algorithm - 计算数组中的值 "surround"数组外的不同值

graphics - 如何在我的 matlab 绘图中将冲浪设置为一种颜色(无渐变)?

java - 来自十六进制颜色值的光强度

java - 使用 Graphics2D 绘制图像

math - 查找垂直点与直线相交处的 x 和 y 坐标

html - 如何仅使用 CSS 创建对话泡泡

Python:确定列表列表是否包含定义的序列

algorithm - 预期运行时间与最坏情况运行时间

algorithm - 面积最大化在直方图算法中的应用