由一组坐标

时间:2018-09-28 21:34:36

标签: algorithm

我得到了一组N个2D坐标。配对

的所有可能的2个组合

坐标,那么我们可以形成N *(N-1)/ 2个平行于

的矩形

两个点均为相邻顶点的两个轴。现在,我需要找到

这些矩形的面积之和,其中采用强行压缩(即迭代

通过所有组合)获得TLE。所以到目前为止,我最大的尝试是:

For example, if N = 5, then for all coordinates (xi, yi) where 0 <= i < N:

the sum of rectangle areas would be

(x0 - x1) * (y0 - y1) +
(x0 - x2) * (y0 - y2) +
          .
          .
          .
(x3 - x4) * (y3 - y4)

=

x0y0 + x1y1 - x0y1 - x1y0 +
x0y0 + x2y2 - x0y2 - x2y0 +
            .
            .
            .
x3y3 + x4y4 - x3y4 -x4y3

=

(N-1) * (x0y0 + x1y1 + x2y2 + x3y3 + x4y4) -
x0 * (y1 + y2 + y3 + y4) -
x1 * (y0 + y2 + y3 + y4) -
x2 * (y0 + y1 + y3 + y4) -
x3 * (y0 + y1 + y2 + y4) - 
x4 * (y0 + y1 + y2 + y3)

we can calculate the sum of y coordinates while input,

then we can get the last four terms by simply subtracting the corresponding y coordinate 

of the coefficient (x0 ~ x4).

Thus, all five terms can be calculated with O(n) time complexity.

然后我发现了一个重大缺陷,这让我很失望:

这在x0 > x1, y1 > y0(或任何其他两个坐标)下将不起作用,

此矩形的区域变为x0y1 + x1y0 - x0y0 -x1y1的地方,

与我的方法不同。

是否可以解决此问题(当然,无需花费时间

复杂度O(n ^ 2)),或者为此的算法实际上是完全

另外一个?

编辑:内存使用率不是问题

编辑2:坐标可以重复,或具有相同的x(y)值。在这种情况下,面积为0

2 个答案:

答案 0 :(得分:2)

您的给定问题可以用O(n * log(n))时间复杂度来解决,这是我们可以解决的方法:

让我们固定一个点(x 0 ,y 0 ),我们要为该点计算可以使用此点制定的所有可能矩形的总和。< / p>

相同的公式将是:

Formula

对于所有x i 和y i ,其中(x 0 ≥x i && y 0 ≥y i ),可以将公式简单地分解为

= ∑(x 0 y 0 + x i y i )-(x i y 0 + x 0 x i

现在让我们讨论如何计算O(log(n))中公式的每个组成部分。

  • x 0 y 0 〜只是当前点的乘积,可以在O(1)中轻松计算
  • x i y i 〜所有点的所有x坐标和y坐标的乘积之和,使得x 0 ≥x i && y 0 ≥y i 。易于查询此类数字的数据结构可以是2D二进制索引树(BIT)或2D段树。这是一个漂亮的数据结构,我真的建议您在线阅读它。在给定的情况下,我希望使用2D BIT,因为它们更容易编码。我的实现之一的链接在这里:https://github.com/nileshsah/advanced-data-structures/blob/master/2d_Binary_Indexed_Tree.cpp
  • x i y 0 〜是y 0 乘以所有x i 之和y i ≤y 0 和x i ≤x 0 ,为此我们可以为其保留另一个2D BIT给定xy范围内所有x i 的总和。然后我们可以在O(log(n))中取回该值
  • x 0 y i 〜是x 0 乘以所有y i 之和x i ≤x 0 和y i ≤y 0 ,我们为它们保持了不同的2D BIT给定xy范围内所有y i 的总和。然后我们可以在O(log(n))中取回该值

对于所有其他情况,我们只需要对与上述每个组件相关的符号以及要使用前缀和数组或加法器计算的和范围进行微调即可。 2D BIT树。

如有需要,我愿意解释更多。希望这为您解决特定问题提供了一个良好的起点。干杯! :)

答案 1 :(得分:0)

使用ABS(x_i-x_j)* ABS(y_i-y_j)

因为您正在求和每个矩形的面积。这意味着矩形的面积彼此独立。因此,必须生成O(n ^ 2)个矩形并找到每个矩形的面积,以便O(n ^ 2)。

考虑简单的情况;点是(0,0),(2,1),(1,2)。并得出结论,您必须计算所有面积。

如果要计算的是所有矩形的覆盖范围所产生的,那将是另一种情况。