【问题标题】:Efficient data structure for storing 3d points用于存储 3d 点的高效数据结构
【发布时间】:2016-03-05 20:25:36
【问题描述】:

我正在寻找用于存储 3d 点 (x,y,z) 的高效数据结构。在数据结构中的点处存储的效果应该会生成内存效率更高的结构和更快地搜索特定坐标集。 3d 点映射到特定 ID,因此它应该能够跟踪我正在寻找任何可用实现的每组坐标。

x, y, z 给出每个节点的笛卡尔坐标。

id x y z

1 14.566132 34.873772 7.857000

2 16.022520 33.760513 7.047000

3 17.542000 32.604973 6.885001

4 19.163984 32.022469 5.913000

5 20.448090 30.822802 4.860000

6 21.897903 28.881084 3.402000

7 18.461960 30.289471 8.586000

8 19.420759 28.730757 9.558000

坐标的数量会很大,可能在 1 000 000 左右。

提前致谢!

【问题讨论】:

  • 到目前为止您考虑过哪些选项?
  • 已经考虑过八叉树 en.wikipedia.org/wiki/Octreeen.wikipedia.org/wiki/R-tree 但讲解员找到了存储 3d 坐标的任何好的实现
  • 您应该指定什么对您很重要。代码可读性(结构的简单数组)、自动矢量化(数组的结构),或者可能是良好的插入/搜索时间(八叉树?)。例如,在 N 体计算中,八叉树是 O(nlog n) 的最佳方法。
  • 一百万个浮动三元组远非巨大。
  • 与顺序列表相比,内存效率更高的结构不太可能提供更快的搜索时间。通常,有一个权衡。如果您想要更快的搜索,那么您可能需要使用更多内存。如果您想使用更少的内存,那么您将不得不忍受较慢的搜索时间。

标签: c++ data-structures 3d binary-search-tree cgal


【解决方案1】:

内存效率更高的结构

比什么更节省内存?一个列表?您需要为此进行压缩。

更快地搜索一组特定的坐标

如果您想从一组坐标中找到最近的 k 个点,ball tree 是一个不错的选择。

如果你想搜索一个卷,四叉树(或octree)效果更好。

【讨论】:

  • 是的,比将所有内容存储在列表中更节省内存 结构坐标 { double x;双 y;双z; }; int main(){ std::vector 列表;坐标 a = 坐标(2.123123,2.1231,3.112);列出 .push_pack(a); }
【解决方案2】:

我听说您正在查找的坐标将与结构中的坐标完全匹配。也许取决于您的空间分布,您可以创建一个哈希函数来获取坐标并尝试生成一些相当独特的东西,然后只需使用标准哈希映射。大多数现代语言都提供了某种哈希映射实现,因此您需要做的就是为您的坐标提供那些适当的哈希值。

如果您需要查找测试坐标附近的坐标,则可以使用 balltree 或 octree 之类的,但听起来这不是您所需要的。

【讨论】:

  • 通过散列,它们需要逐位相等。如果查找值是浮点运算的结果,则由于精度损失可能不正确。如果是这种情况,散列函数必须考虑最大错误并在实际散列之前丢弃最低有效位。但我认为 OP 对他需要什么有点困惑。
  • 我知道,这就是为什么我将我的答案限定为仅用于完全匹配。在需要某个 epsilon 内的匹配的情况下,从底部丢弃位只会统一一些邻居(在 3D 坐标的情况下约为八分之一)。用浮点数更难可视化,但考虑一下接近整数邻居 255 和 256 之间的按位差异。我不建议这样做。基于 epsilon 的搜索需要不同的数据结构。
【解决方案3】:

您可以使用struct

struct coordinate
{
   double x;
   double y;
   double z;
} points[1000000];

【讨论】:

  • 一个小改进:鉴于他显然只有 7 个有效数字,他可能想使用 float 而不是 double。对于 3D 应用程序来说,这并不是一个不常见的选择……
  • 由您决定要存储多少精确值!
  • 这只是我正在寻找用于存储 3d 坐标的数据结构的结构。在这种结构中,我将不得不强制搜索特定的坐标集,而这不是我想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-25
  • 2013-01-27
  • 2019-09-22
  • 2015-06-26
  • 1970-01-01
  • 2016-10-28
相关资源
最近更新 更多