【问题标题】:Auto-balancing (or cheaply balanced) 3D datastructure自动平衡(或廉价平衡)3D 数据结构
【发布时间】:2013-08-01 09:21:38
【问题描述】:

我正在开发一种需要 3D“基于体素”引擎的工具。我的意思是它将涉及从网格中添加和删除多维数据集。为了管理这些多维数据集,我需要一个允许快速插入和删除的数据结构。我在 k-d 树和八叉树中看到的问题是,由于这些操作,它们似乎经常需要重新创建(或至少重新平衡)。

在我加入之前,我想就解决此问题的最佳方法获得意见。

更多细节:

  • x,y,z 位置在整数空间中
  • 需要对实时应用程序足够高效
  • 对使用的多维数据集的数量没有硬性限制。 很可能这个数字通常是无关紧要的 低(

我想最终的问题是,以能够处理频繁插入和删除的方式管理本质上是 3D 点数据的最佳方式是什么?

(不,我不是在制作 Minecraft)

【问题讨论】:

  • 如果只需要插入和删除,使用简单的哈希表,以(x,y,z)为key。但我想在某些时候你也需要进行空间查询,对吧?
  • 我现在不确定。我目前的需求实际上并不需要空间查询,但我可以看到它们在某些时候是必要的。为了简单起见,我可能会从哈希表开始,然后根据需要移动到八叉树。谢谢!

标签: data-structures 3d voxel


【解决方案1】:

Octrees 很容易动态更新。通常情况下,树会根据每片叶子的上/下种群数量进行细化:

  1. 插入新项目时,会将其推送到封闭叶节点的项目列表中。如果超过了种群数量上限,则对叶子进行细化。

  2. 删除现有项目时,会将其从封闭叶节点的项目列表中删除。如果达到较低的人口计数,则扫描叶兄弟。如果所有兄弟节点都是叶节点,并且它们的累积项目数小于上层人口数,则删除兄弟节点集并将项目推送到父节点。

这两个操作都是局部的,只遍历树的高度,即O(log(n)) 用于分布良好的点集。

另一方面,KD 树不容易动态更新,因为它们的结构是基于完整点集的分布。

还有许多其他支持动态更新的空间数据结构 - R-treesDelaunay triangulations 仅举几例,但尚不清楚它们是否会提供比八叉树更好的性能。我不知道任何支持比O(log(n)) 动态查询更好的空间结构。

希望这会有所帮助。

【讨论】:

  • 正如 fortran 提到的,我最好从哈希表开始。不过,我显然对八叉树有一些误解,所以感谢您的澄清。该链接(特别是增长和缩小部分)正是我最初寻找的。​​span>
猜你喜欢
  • 1970-01-01
  • 2013-08-31
  • 1970-01-01
  • 2016-12-31
  • 2020-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多