我有数千个由轴对齐边界框表示的对象。我可以很容易地计算出包含所有项目的最小轴对齐边界框,但这是一个相当昂贵的操作。我希望有一个结构,我可以在最多对数时间插入/更新/删除项目,然后获得包含所有项目的当前边界框。
哪种数据结构非常适合此问题?
答案 0 :(得分:1)
这里有一个更简单的想法:4个二叉树。
所以4个两倍大小的数组。根将在元素1中,对象的边界框是叶子(在数组的后半部分)。两个节点的父节点将保存其两个子节点的min
(或max
)。未使用的树叶应该包含int.MinValue
或int.MaxValue
(分别用于max
和min
树)。在O(log n)中更新非常简单,见下文。
你有
min
坐标为<{1}}的树left
坐标为<{1}}的树max
坐标为<{1}}的树right
坐标为<{1}}的树总边界框由根描述,可在O(1)中找到。
更新程序是这样的:(未经测试)
min
如果父母的更新没有更改,则有可能提前退出。
这概括为具有更高学位的树木,使得它们变浅,而不是花费top
或max
超过2个项目。根据我的经验,对于较大的树木而言,这是值得的,但只有在一定程度上,增加程度很快会导致收益递减。你可以试试4和8(2度幂是最好的,它可以避免使数学复杂化。)
答案 1 :(得分:0)
有一类称为动态数据结构的数据结构,在假设底层元素正在移动的情况下支持有效的多维查询。我并不是他们的专家,但this set of lecture slides似乎是一个很好的起点。看起来STAR-tree可能是一个很好的数据结构;它看起来像是R树的动力学版本。
希望这有帮助!