2010-07-24 75 views
26

我需要一个算法,需要轴对准的矩形的一个未排序的阵列和 返回任何一对矩形的重叠轴对齐矩形相交

每个矩形具有两个变量中,左上角的坐标和在右下角

回答

17

下面是在DuduAlul的链接中提出的交集算法的简要说明。

该解决方案需要使用能够执行范围查询的搜索树。范围查询要求K1和K2之间的值的所有项目,并且它应该是O(R + log N)操作,其中N是树项目的总数,R是结果的数目。

该算法采用扫描方式:

1)排序的所有左,右边缘的矩形,根据自己的X值,到列表L.

2)创建一个新的空范围搜索树T,为矩形的顶部Y的排序/塔底

3)创建独特的矩形对

4)导线L的升序的一个新的空的结果集RS。为以L所有的V:

     如果V.isRightEdge()

            T.remove(V.rectangle.top)

           Ť .remove(V.rectangle.bottom)

     其他

           对于所有u在T.getRange(V.rectangle.top,V.rectangle.bottom)

                  RS.add (< V.rectangle,U.rectangle>)

            T.add(V.rectangle。顶部)

            T.add(V.rectangle.bottom)

5)返回RS


的时间复杂度是O(R + N日志N),其中R是交叉点的实际数量。

- 编辑 -

我想通了,解决的办法是不完全正确 - 在树T的相交测试错过某些情况下。树应保持Y间隔而不是Y值,理想情况下应该是Interval Tree

+0

这是一个很好的答案。我也在课堂上发现它 - 从csail.mit.edu手中抢走Google Interview_ – 2013-08-13 13:01:11