【问题标题】:Create a neighbourhood graph from a list of voxels faster than in O(n^2)?从体素列表创建邻域图比在 O(n^2) 中更快?
【发布时间】:2012-06-22 01:50:54
【问题描述】:

我目前正在通过大致执行以下操作来创建“邻域图”:

for every voxel
  look at every other unseen voxel 
    check if neighbours

大致以 n 平方(减去 n)运行。对于一定数量的体素是可以接受的,但显然对于更大的列表会花费更多时间。

另一个简单的解决方案是将所有内容放入一个大的 3d 数组或 hashmap 中,这将在 O(n) 中运行,但会消耗更多内存。

有没有更快的方法?我似乎无法在 google 中输入正确的搜索字词...

【问题讨论】:

  • 哈希方法需要的内存相对较少。这取决于您的实现语言,但大致相当于每点 5 或 6 个指针/整数。
  • 如果你有一个由均匀分布的体素组成的 3d 数组,那么找到邻居是微不足道的(每个索引中的 +/- 1)。如果您当前将每个体素的一些信息存储在一个大的 1 维数组中,那么重塑为 3 维数组不会改变数据的大小。

标签: algorithm data-structures graph voxel neighbours


【解决方案1】:

您可能想查看像octreek-d tree 结构这样的空间分区树。这些结构通常可以非常有效地构建(O(n) 或 O(n log n),IIRC),然后提供极快的查找以查找给定边界框中的最近邻居或点。使用其中一种结构应该会给您带来巨大的性能提升,而不会产生巨大的 3D 数组的巨大内存成本。

希望这会有所帮助!

【讨论】:

  • “用于查找最近的邻居或给定边界框内的点。”这个边界框是如何定义的?
  • 这些数据结构让您可以查询“这是一个 2D 或 3D 盒子 - 这个盒子里的所有点是什么?”
猜你喜欢
  • 2021-01-29
  • 2021-12-22
  • 2018-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 2021-09-25
相关资源
最近更新 更多