当千件物品中的一件移动时,快速更新边界框?

时间:2014-05-26 18:50:06

标签: data-structures spatial-index

我有数千个由轴对齐边界框表示的对象。我可以很容易地计算出包含所有项目的最小轴对齐边界框,但这是一个相当昂贵的操作。我希望有一个结构,我可以在最多对数时间插入/更新/删除项目,然后获得包含所有项目的当前边界框。

哪种数据结构非常适合此问题?

2 个答案:

答案 0 :(得分:1)

这里有一个更简单的想法:4个二叉树。

所以4个两倍大小的数组。根将在元素1中,对象的边界框是叶子(在数组的后半部分)。两个节点的父节点将保存其两个子节点的min(或max)。未使用的树叶应该包含int.MinValueint.MaxValue(分别用于maxmin树)。在O(log n)中更新非常简单,见下文。

你有

  1. min坐标为<{1}}的树
  2. left坐标为<{1}}的树
  3. max坐标为<{1}}的树
  4. right坐标为<{1}}的树
  5. 总边界框由根描述,可在O(1)中找到。

    更新程序是这样的:(未经测试)

    min

    如果父母的更新没有更改,则有可能提前退出。

    这概括为具有更高学位的树木,使得它们变浅,而不是花费topmax超过2个项目。根据我的经验,对于较大的树木而言,这是值得的,但只有在一定程度上,增加程度很快会导致收益递减。你可以试试4和8(2度幂是最好的,它可以避免使数学复杂化。)

答案 1 :(得分:0)

有一类称为动态数据结构的数据结构,在假设底层元素正在移动的情况下支持有效的多维查询。我并不是他们的专家,但this set of lecture slides似乎是一个很好的起点。看起来STAR-tree可能是一个很好的数据结构;它看起来像是R树的动力学版本。

希望这有帮助!