R*树重叠计算
R* Tree overlap computation
我正在阅读R* Tree的实现,我注意到它们计算重叠的方式与论文中定义的不同。
在本文中,重叠定义如下:
如果在k上加上r项,则节点k的重叠是这个值的增量。对于给定的节点/rect k,计算k与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*-树试图最小化重叠扩展,而不是重叠本身。
一些重叠可能是不可避免的。如果已经存在重叠,则不能期望在插入其他矩形时减少重叠。但是你至少可以试着不增加重叠的数量。
至于性能方面的考虑,请检查是否需要实际计算相交矩形。试着用函数intersectionSize()
代替计算area(intersection())
。这个确实起作用。例如,如果A.maxX = 1
和B.minX = 2
,我可以立即给出相交的大小为0,而不用考虑任何其他维度。
避免急切地预先计算你可能需要的所有交叉点等。相反,只计算那些你真正需要的。配置您的代码,并查看是否可以优化关键代码路径。那里通常有一些唾手可得的果实。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 递归函数计算序列中的平方和(并输出过程)
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的字符计数代码计算错误.为什么
- Ardunio UNO解决了多个重叠的定时器循环
- 在计算中使用二的幂有多有利可图
- 如何计算文件中的"columns"数?
- 计算排序向量的向量中唯一值的计数
- 如何使用 std::累积在 C++ 中计算总和立方体
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- 使用Qt C++计算类似Git的SHA1哈希
- OpenCV C++.快速计算混淆矩阵
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- C++如何计算用户输入的数字中的偶数位数
- 如何计算数据类型的范围,例如int
- 类似枚举的计算常量
- CUDA中的存储器计算重叠问题
- 计算碰撞中两个正方形的重叠
- R*树重叠计算
- 计算地图内部的重叠时间