给定网格L * C中的N个矩形(N <= 100.000)的坐标(L和C的范围可以从0到1.000.000.000)我想知道在任何点上任何点的矩形重叠的最大数量是多少网格。
所以我想我会使用扫描算法,对于按x值排序的每个事件(矩形的开头或结尾),我添加或删除我的结构的间隔。
我必须使用树来保持间隔的最大重叠,并且能够添加和删除间隔。
我知道当间隔(开始和结束)的值在0到100.000范围内时如何做到这一点,但这里不可能,因为平面的尺寸是0到1.000.000.000。我该如何实现这样的树?
答案 0 :(得分:3)
如果您事先知道所有矩形的坐标,则可以使用“坐标压缩”。
由于您只有10 ^ 5个矩形,这意味着您最多有2 * 10 ^ 5个不同的x
和y
坐标。因此,您可以创建从这些坐标到1到2 * 10 ^ 5的自然数的映射(通过简单地对坐标进行排序)。然后,您可以使用已知的新坐标的普通树。
这足以获得矩形的数量,但是如果你还需要它们重叠的点,你还应该保持反向映射,这样你就可以回到矩形的真实坐标。在一般情况下,答案将是一个矩形,而不仅仅是一个点。
答案 1 :(得分:2)
使用interval tree。你的情况有点复杂,因为你真的需要一个加权区间树,其中权重是该区间的开放矩形数。