Algorithm 使用线段树的矩形并集面积
我试图理解可以用来计算一组轴对齐矩形的并集面积的算法 我下面介绍的解决方案如下: 我不明白的是: 段树是此数据结构的正确选择。它具有复杂性O(logn) 对于更新操作和O(1) 用于查询。我们需要使用每个节点的分数来扩充段树,并具有以下属性Algorithm 使用线段树的矩形并集面积,algorithm,geometry,computational-geometry,Algorithm,Geometry,Computational Geometry,我试图理解可以用来计算一组轴对齐矩形的并集面积的算法 我下面介绍的解决方案如下: 我不明白的是: 段树是此数据结构的正确选择。它具有复杂性O(logn) 对于更新操作和O(1) 用于查询。我们需要使用每个节点的分数来扩充段树,并具有以下属性 每个节点对应于一个y-区间,该y-区间是节点范围内所有索引上的基本y-区间的并集 如果节点值为零,则分数为子代分数之和(如果节点为叶,则为0) 如果节点值为正值,则分数为对应于该节点的y间隔的长度 我们如何在O(n log n)中实现这一点 我的想法是创
- 每个节点对应于一个y-区间,该y-区间是节点范围内所有索引上的基本y-区间的并集
- 如果节点值为零,则分数为子代分数之和(如果节点为叶,则为0)
- 如果节点值为正值,则分数为对应于该节点的y间隔的长度
谢谢让我们考虑一些简单的例子: 根据您的理解,您将创建底部有11-1=10个节点的段树,如下所示: 请注意,我们在base中只有9个节点,因为第一个节点用于interval[1,2],下一个节点用于interval[2,3],依此类推 当您输入某个矩形时,您将根据其y坐标更新其范围,因此在x=0上遇到第一个矩形后,您的线段树将如下所示: 我们还需要使用一种称为延迟传播的方法来更新树上的活动间隔,因此所有活动间隔的总和都是1 所以,当前方法的复杂性类似于O(K logk),其中K=max(y)-min(y) 我们可以很容易地把它简化为O(n logn),其中n是矩形的数目 请注意,唯一重要的y坐标是存在的y坐标,因此在本例中为1,3,6,11 还要注意,这样的坐标最多有2*n 所以我们可以将所有坐标映射到一些整数,这样它们就更适合分段树了 这被称为坐标压缩,可以通过以下方式完成:
[1,3,6,11]
[1,3,6,11]
mp[1]=1,mp[3]=2,mp[6]=3,mp[11]=4
- 在树中搜索x作为左边界(对数(N)次)
- 在树中搜索y作为右边界(对数(N)次)
- 如果父节点[a,c]有两个子节点[a,b],[b,c],且左边界x在[a,b]中,则决定是否增加节点[b,c]中的值(取决于y是否大于c)
- 如果父节点[a,c]有两个子节点[a,b],[b,c],且右边界y在[b,c]中,则决定是否增加节点[a,b]中的值(取决于x是否小于a)
您决定是否更新的节点数为log(N)(对于x)+log(N)(对于y)。我们可以使用坐标压缩仅保留必要的坐标,以便在段树中只有O(N)个元素base@Photon你能再解释一下吗?或者任何我可以阅读的推荐链接?文本说“更新操作的复杂度为O(logn),查询的复杂度为O(1)”。由于树最多包含n个节点,最多更新n次,因此最坏情况为O(n logn)。实际上,O(n logm),其中m是树中的一些平均节点数,可以是√n(因此差异没有log那么显著√n=1/2 log n)。这可能是一个幼稚的问题-但在您的第一个图表中,每个节点上的值是否是其子节点的最大值?谢谢,我不确定我是否理解在遇到第一个矩形后,如何从第一个图形中得到第二个图形。正在更新的y范围应该是[3,6],不是吗?为了澄清,您能否指定每个节点内的值的含义?我想这会帮助我理解如何从f得到图2