我正在研究一种有效的算法来“隐藏”在一组N
矩形(轴对齐)中以2D布局的所有交叉矩形对。
所有矩形都具有相同的宽度和高度。
假设我在2D中布置的起始矩形集是
R={r_1,r_2,...,r_n}
其中r_i
是所有矩形,r_i
具有布尔属性visible
。
我想找到R的子集S,这样对于每个r_i
,属于S r_j
的{{1}}都不相交。
第一个简单的解决方案是强力 - 最大独立集方法。
首先,我迭代r_i,_r_j
矩形(给定的矩形不与自身相交)并检查它们是否相交。同时我还将集合N(N-1)/2
中的所有矩形作为图R
的节点。该图中的边由交叉三角形对表示。
非交叉矩形的集合然后是图的一个最大独立集。
我认为这不是最快的方法,尽管是正确的。我在一些讨论中读过,例如,如何通过x坐标预先排序矩形列表,可以加快交叉矩形对到G=(V,E)
的计算速度(而不是强力O(nlog(n) )
。
现在我问,有人知道这个问题的更好的算法(用于计算一组矩形中的交叉对以及过滤那些矩形吗?)
将问题重新定位为SAT问题也很有意思,尽管这个想法刚出现在我的脑海中。问题在于找到O(n^2)
属性的排列,使得没有可见的矩形与另一个相交。
答案 0 :(得分:3)
是的,您应该按x排序矩形 由于矩形在同一个x轴上并且高度相同,因此在对它们进行排序后,您应该能够在线性时间内找到交点。您正在寻找的算法称为扫描线。
您将扫描线移动到所有矩形上(从刚刚排序的集合中的x坐标跳转),并查看哪些矩形在当前x位置相交。将所有x coord重叠矩形加载到数据结构中并检查它们是否相交(基于y坐标)。
答案 1 :(得分:2)
可能不只有一个子集S
。例如,请考虑以下矩形布局:
+-----+
| |
| A |
+----| +-----+
| +----| |
| D | | B |
| |--- + |
+-----+ |----+
| C |
| |
+-----+
{A,C}
和{B,D}
都是有效答案。所以,这个问题有些不明确。您在寻找最大基数子集吗?
答案 2 :(得分:1)
测试所有成对组合是一个好主意,但是O(n ^ 2)有助于找到加快它的方法。
将空间划分为粗网格,如棋盘格,每个单元格都有一个矩形列表。这意味着矩形的中心点位于单元格中。这种矩形到单元格的分配是O(n)。
细胞必须比矩形的大小舒适,可能是矩形的两倍,并且整个空间需要分成“几个”行和列 - 比如十几个,几百个,但是许多对于数量是有意义的矩形和它们居住的区域的大小。但是,至少有五行五列,否则你将无法获得更高的效率。
然后测试每个细胞内的所有成对组合。这将消除一堆重叠对。对于每个单元格,您还必须测试涉及八个相邻单元格的所有成对组合 - 共享一个边或角的单元格 - 因为矩形可以重叠多达四个单元格。当然,小心不要重对数。
执行时间被保存,因为你永远不会测试任何一个矩形在这里的方式,另一个在远方的区域结束。
这种技术很通用,可以应用于任何形状,类似于物理学家在模拟巨大星系(如星系中的恒星)时使用的技术。