Algorithm 最大面积矩形

Algorithm 最大面积矩形,algorithm,math,geometry,Algorithm,Math,Geometry,给定的点集(x[1];y[1]),(x[2];y[2]),…,(x[n];y[n])。我们需要找到矩形的最大面积。矩形的顶点应在点集中。此外,矩形不必与轴对齐。例如,回答(1;1)、(2;2)、(2;0);(3;1)是2。 n每对点确定一条线L,该线具有斜率m和截距c。(暂时忽略垂直线。)不考虑截距,让我们使用一个不同的量,给出几乎相同的信息:线和原点之间的距离d(L),即垂直于L并将L连接到原点的线段R的长度。此外,我们可以讨论点沿L的“位移”:我们可以说,L上与R相交的点p的位移为0,而L上

给定的点集
(x[1];y[1]),(x[2];y[2]),…,(x[n];y[n])
。我们需要找到矩形的最大面积。矩形的顶点应在点集中。此外,矩形不必与轴对齐。例如,回答
(1;1)、(2;2)、(2;0);(3;1)
是2。

n每对点确定一条线L,该线具有斜率m和截距c。(暂时忽略垂直线。)不考虑截距,让我们使用一个不同的量,给出几乎相同的信息:线和原点之间的距离d(L),即垂直于L并将L连接到原点的线段R的长度。此外,我们可以讨论点沿L的“位移”:我们可以说,L上与R相交的点p的位移为0,而L上x“高于”p的点(与p的距离为x,y坐标更高)的位移为x,p“低于”的点的位移为负。事实上,我们不需要截距或d(L)来定义点相对于线L的位移——只需要线的斜率。定义disp(m,q)为斜率为m的直线上点q的位移

假设a、b、c、d是矩形的顶点,边为ab、bc、cd和da。观察包含ab的线与包含cd的线具有相同的斜率m,并且(disp(m,a),disp(m,b))=(disp(m,d),disp(m,c))。所以我们需要测试的只有4元组的顶点是那些由成对的顶点对组成的,比如ab和cd——具有相同斜率和位移对的顶点对。此外,一条边长(ab和cd共享)等于| disp(m,b)-disp(m,a)|,另一条边长将为| d(Lab)-d(Lcd)|,其中Lab和Lcd分别是包含线段ab和cd的线

要高效查找这些4元组顶点,请执行以下操作:

  • 对于所有顶点对i,j:

    • 让我成为穿过i和j的线。计算其斜率m和距原点的距离d(L)。还计算disp(m,i)和disp(m,j)。如果disp(m,i)任务来自设计公司面试,我编写了解决方案,但它对测试(1;1)、(2;2)、(2;0)给出了错误的答案;(3;1):o可能我的代码不正确,您能检查一下吗?该输入的解决方案是什么?你也在使用整数算术吗?使用整数是最安全的,即使对于斜率(存储整数比率a:b)也是如此,因为当需要进行相等比较时,浮点算法是不可靠的,就像这里一样;它打印0以测试记住进行归一化,因此,例如,12:9变为4:3。嗯,我刚刚意识到使用整数进行置换是不实际的,因为它们可能是无理的。我认为更好的方法是使用FP,但在排序数组Z中使用具有一些“给予”的比较来查找块边界——与其检查x和y的严格相等性,不如检查abs(x-y)