[英]R* Tree overlap computation
我正在阅读R * Tree的此实现 ,并且发现它们计算重叠的方式与本文定义重叠的方式不同。
在本文中,重叠定义如下:
对于给定的节点/ RECT K,计算k和k的每个同级(不包括K)之间的相交处的面积的总和。
那么,重叠放大就是该值的增量,如果将项目r添加到k ,则节点k的重叠就是什么。
像这样:
childOverlapEnlargement(Node child, item r)
{
childEnlarged = child.union(r);
sum = 0;
for(each sibling s of child which isn't node)
{
sum += area(childEnlarged.intersect(s)) - area(child.intersect(s));
}
return sum;
}
在另一个实现中,它们按给定节点与要插入的项的交集区域进行排序。 像这样:
childOverlapEnlargement(Node node, item r)
{
return area(node.intersect(r));
}
显然,它们的实现在计算上比本文的定义要少。 但是,我找不到任何显而易见的逻辑来解释为什么两个计算应该相等。
所以我的问题是:
编辑:重新阅读它们的实现,我意识到他们并没有比较两个同级的交集,而是每个潜在叶子与插入的项的交集。 奇怪的是,他们选择的兄弟姐妹与插入的项目重叠最少。 您是否要插入与要插入的项目重叠最多的节点中?
您正在查看的实现可能存在错误或不正确。 没有人是完美的。
请注意,R *树尝试最小化重叠扩大 ,而不是重叠自身。
某些重叠可能是不可避免的。 如果已经存在重叠,则不能期望在插入其他矩形时取消重叠。 但是您可以尝试至少不增加重叠量。
考虑到性能,请检查是否需要实际计算相交矩形。 尝试代替计算area(intersection())
来做一个函数intersectionSize()
。 这确实有所作为。 例如,如果A.maxX = 1
和B.minX = 2
我可以立即给出交集大小0,而无需考虑其他任何尺寸。
避免急切地预先计算可能需要的所有交集等。 相反,仅计算您实际需要的那些。 分析您的代码,并查看是否可以优化关键代码路径。 通常那里有一些低垂的水果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.