【问题标题】:Rapid update of bounding box when one of a thousand items moves?当一千个项目中的一个移动时快速更新边界框?
【发布时间】:2014-05-26 18:50:06
【问题描述】:

我有成千上万个由轴对齐的边界框表示的对象。我可以轻松计算包含所有项目的最小轴对齐边界框,但这是一项相当昂贵的操作。我想要一个结构,我最多可以在对数时间内插入/更新/删除项目,然后在恒定时间内获取包含所有项目的当前边界框。

什么数据结构最适合这个问题?

【问题讨论】:

  • 出于好奇,您最终是如何解决问题的?
  • 两个排序列表,每个轴一个。插入/删除在日志时间,使用二进制搜索。通过查看列表的头部/尾部,最小值/最大值是恒定的时间。
  • 你们如何支持更新?

标签: data-structures spatial-index


【解决方案1】:

这是一个更简单的想法:4 棵二叉树。

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

你应该有

  1. minleft 坐标的树
  2. max 表示right 坐标的树
  3. mintop 坐标的树
  4. maxbottom 坐标的树

总边界框由根描述,在 O(1) 中可用。

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

update(array, item, newvalue)
    index = (array.length >> 1) + item  // index of leaf
    array[index] = newvalue;
    while (index > 1)
        parent = index >> 1
        sibling = index ^ 1
        array[parent] = min(array[index], array[sibling])
        index = parent

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

这可以推广到具有更高程度的树,使它们更浅,但代价是使用超过 2 个项目的 minmax。以我的经验,对于较大的树木来说,这可能是值得的,但仅在一定程度上,增加程度很快就会导致收益递减。您可以尝试 4 和 8(最好是 2 次方,这样可以避免数学复杂化)。

【讨论】:

    【解决方案2】:

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

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-23
      相关资源
      最近更新 更多