我不知道你所说的“尝试每种可能的旋转”是什么意思,因为它们有无限多个,但这个基本想法实际上可以产生非常高效的解决方案:
第一步是计算凸包。这实际上节省了多少取决于数据的分布,但是对于从单位圆中均匀选择的点,期望凸包上的点数为O(n^1/3)。有许多方法可以完成这项任务:
h
是凸包上的点数。此时,检查迄今收集的每个角度应该足够(由我和Oliver Charlesworth共同推测,并由Evgeny Kluev提供了一个证明要点链接1)。最后,让我参考Lior Kogan的答案中相关的参考资料。
对于每个方向,边界框由该区间内每个角度的相同四个(不一定不同)点定义。对于候选方向,您将至少有一个任意选择。找到这些点可能看起来像是O(h ^ 2)的任务,直到你意识到轴对齐边界框的极限与您开始合并的极限相同,并且连续的区间具有其极端点相同或连续。让我们按顺时针顺序称极端点为A、B、C、D,称限制边界框的相应线条为a、b、c、d。当输入为凸包时(构建凸包的复杂度等于对输入点进行排序的复杂度),"A Linear time algorithm for the minimum area rectangle enclosing a convex polygon" [Arnon, Gieselmann 1983] 发布了一种简单而优雅的O(n)解决方案。该解决方案基于 Shamos, 1978 中描述的 Rotating calipers 方法。在线演示可在 此处 查看。
当我看到这个问题时,首先想到的是使用主成分分析。我猜测最小的矩形应该满足两个条件:边缘与主轴平行,并且至少有四个点位于边缘上(被限制的点)。这个方法应该可以扩展到n维。