这个问题已经得到了答复,但我面临的主要问题是理解其中一个答案。
首先,通过对点进行排序/计算凸包(在O(n log n)时间内),如果必要的话,我们可以假设我们有带有点的凸多边形/壳,这些点按照它们在多边形中出现的顺序循环排序。将点1、2、3、...、n称为A、B和C(变量),分别从1、2和3开始(按循环顺序)。我们将移动A、B、C直到ABC是最大面积三角形。(这个想法类似于旋转卡尺方法,在计算直径(最远对)时使用。)
固定A和B,向前推进C(例如,最初,当A=1,B=2时,C通过C=3、C=4等向前推进),只要三角形的面积增加,即只要Area(A,B,C) ≤ Area(A,B,C+1),就继续前进。这个点C将最大化那些固定的A和B的Area(ABC)。(换句话说,函数Area(ABC)作为C的函数是单峰的。)
From https://dev59.com/13I-5IYBdhLWcg3w487k#1621913
以下算法如何达到O(n)?首先,通过对点进行排序/计算凸包(在O(n log n)时间内),如果必要的话,我们可以假设我们有带有点的凸多边形/壳,这些点按照它们在多边形中出现的顺序循环排序。将点1、2、3、...、n称为A、B和C(变量),分别从1、2和3开始(按循环顺序)。我们将移动A、B、C直到ABC是最大面积三角形。(这个想法类似于旋转卡尺方法,在计算直径(最远对)时使用。)
固定A和B,向前推进C(例如,最初,当A=1,B=2时,C通过C=3、C=4等向前推进),只要三角形的面积增加,即只要Area(A,B,C) ≤ Area(A,B,C+1),就继续前进。这个点C将最大化那些固定的A和B的Area(ABC)。(换句话说,函数Area(ABC)作为C的函数是单峰的。)
接下来,如果这样可以增加面积,就提高B的值(不改变A和C)。如果是这样,请像上面那样再次提高C的值。然后再次提高B的值(如果可能的话),等等。这将给出以A为一个顶点的最大面积三角形。(前面的部分应该很容易证明,分别对每个A单独执行此操作将会得到O(n2)。但请继续阅读。)现在,如果提高A的值可以改善面积,则继续执行。
B
和C
围绕数组。然而,根据描述,这种环绕并不是必要的:在看到代码之前,我想象方法会停止B
和C
超过n
的进展。在这种情况下,它肯定是O(n)
。由于代码的呈现方式,我不确定。出于某些数学原因,B
和C
在整个算法中仍然只迭代O(n)
次,但我无法证明。我也无法证明不进行环绕是正确的。 - IVlad