算法 - 查找覆盖给定矩形区域的矩形数

时间:2012-09-24 23:34:18

标签: algorithm

这不是作业问题。这是一个面试问题。我无法为这个问题找到好的解决方案。

问题:

给定n * n(左下角(0,0),右上角(n,n))网格和n个矩形,其边与坐标轴平行。 n个矩形的左下和右上坐标以(x1,y1)(x1',y1')......(xn,yn)(xn',yn')的形式提供。存在M个查询,其询问覆盖具有坐标(a,b)(c,d)的矩形的矩形的数量。如何以有效的方式解决它?有没有办法预先计算所有坐标位置,以便我可以在O(1)中返回答案。

约束: 1< = n< = 1000

1 个答案:

答案 0 :(得分:1)

在O(n ^ 4)空间和O(n ^ 5)时间内创建提供O(1)查找的数据结构是直截了当的。如果M超过O(n ^ 2),那么这样做可能是值得的。在O(n ^ 2)空间和O(n ^ 3)时间内创建在O(n)时间内提供查找的数据结构也是直截了当的。如果M是O(n ^ 2),那可能是更好的权衡;即,O(n ^ 3)预计算时间和O(n ^ 3)时间为O(n ^ 2)查找每个O(n)。

对于预计算,请创建一个n乘n列表。设L_pq表示n乘n网格的单元p,q的列表。每个列表最多包含n个矩形,列表全部按相同关系排序(即,如果一个列表中为Ri < Rj,则该对中的每个列表中都为Ri < Rj。该组列表需要时间O(n ^ 3)来计算,取为“对于n ^ 2个单元格的每个C,对于n个矩形的每个R,如果R中的C将R添加到L_C”或“对于每个R”在n个矩形中,对于R中的每个单元C,将R加到L_C“。

给定查询(a,b,c,d),在时间O(n)中计算列表L_ab和L_cd的交集的大小。对于O(1)查找,首先执行上面提到的预计算,然后对于每个a,b,对于每个c>ad<b,执行上面提到的O(n)查询并将结果保存到P [a,b,c,d]其中P是一个适当大的整数数组。

使用segment treesrange treesinterval trees可能存在O(n ^ 3)或O(n ^ 2·log n)预计算方法在O(log n)时间内进行查询。