这不是作业问题。这是一个面试问题。我无法为这个问题找到好的解决方案。
问题:
给定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
答案 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>a
和d<b
,执行上面提到的O(n)查询并将结果保存到P [a,b,c,d]其中P是一个适当大的整数数组。
使用segment trees,range trees或interval trees可能存在O(n ^ 3)或O(n ^ 2·log n)预计算方法在O(log n)时间内进行查询。