使用平衡化的标准化四叉树。
标准化:收集所有x坐标,对它们进行排序并用排序后的数组中的索引替换它们。y坐标同理。
平衡化:在构建四叉树时,总是在中间坐标处分割。
因此,当您获得一个矩形时,您需要使用一些矩形id在树中标记正确的节点。如果在下面找到任何其他重叠的矩形,则将它们收集到集合中。完成后,如果向量不为空(找到重叠的矩形),则创建一个新矩形来表示子矩形的并集。如果计算的矩形比刚插入的矩形大,则使用新计算的矩形再次应用算法。重复此过程,直到它不再增长,然后移动到下一个输入矩形。
为了提高性能,四叉树中的每个节点都存储所有重叠该节点的矩形,并将其标记为结束节点。
复杂度:初始归一化为O(NlogN)
。插入和检查重叠将是O(log(N)^2)
。您需要为原始的N个矩形以及重叠执行此操作。每次找到重叠时,您都会消除至少一个原始矩形,因此最多可以找到(N-1)个重叠。因此,总体而言,您需要进行2N次操作。因此,总体复杂度将是O(N(log(N)^2))
。
这比其他方法更好,因为您不需要检查任何两个矩形是否重叠。
O(Log(N) ^2)
。由于每个节点都保留与其任何部分重叠的所有矩形,因此一旦您拥有完全被矩形覆盖的节点,就不需要再往下挖掘。这些节点最多有O(Log(N) ^2)个。在纸上举个例子来说服自己。 - Sorin最坏情况时间复杂度由线段树确定:O(n log n)。空间复杂度为 O(n)。
可以合并
不是必须合并。) - greybeard