【问题标题】:Spatial sorting Million points in 3d space空间排序 3d 空间中的百万点
【发布时间】:2014-05-11 21:14:47
【问题描述】:

我在 3d 空间中有百万个点的集合。

每个点都是一个对象

Struct Point
{
    double x;
    double y;
    double z;
};

百万个点以某种随机顺序存储在一个 c++ 向量 MyPoints 中。

我想根据空间中点的空间分布对这百万个点进行排序,这样物理上更近的点在排序后也应该更靠近我的数组。

我对如何做到这一点的第一个猜测如下:首先对 Z 轴排序点,然后沿 Y 轴排序点,然后沿 X 轴排序点

MyPointsSortedAlongZ = Sort(MyPoints, AlongZAxis )
MyPointsSortedAlongY = Sort(MyPointsSortedAlongZ , AlongYAxis  )
MyPointsSortedAlongX = Sort(MyPointsSortedAlongY , AlongYAxis  )

首先,我不知道这种方法是否正确。我的最终点数组 MyPointsSortedAlongX 会在空间上完美排序(或几乎在空间上排序)吗?

其次,如果这种方法是正确的,它是不是最快的方法。有什么更好的方法来做到这一点?

【问题讨论】:

  • 没有办法做到这一点并获得空间距离到线性(一维数组)距离的完美映射,因为您正在降低维度。您可能对 space-filling curves 感兴趣,以此作为大致实现这一目标的方法。
  • 另一种方法是将您的空间离散化为一个 3d 数组,并在每个单元格中存储该单元格中的点或对它们的一些引用。就我个人而言,我喜欢 @OliCharlesworth 建议更好地使用空间填充曲线,但它们可能很难编程。
  • 我没有在帖子中提到空间填充曲线,尽管我知道这一点。我在想是否构造一棵 Barnes-Hut 树然后按顺序遍历该树是否会导致空间排序(但也许我错了)。
  • 如果您还没有实施您的解决方案,您是否看过这篇关于 Morton ordering 的相关 SO 帖子? stackoverflow.com/questions/1024754/…
  • @Rethunk:我确实看过那个解决方案。我想出了更好的实现,可以使用可变大小的 morton 代码。我会在它正常工作时分享它

标签: algorithm sorting 3d computational-geometry


【解决方案1】:

嗯,这实际上取决于您将使用什么指标来比较两个数组,但例如看一下相邻点之间差异之和的指标:

metric(arr) = sum[ d(arr[i],arr[i-1]) | i from 1 to n ]
where d(x,y) is the distance between point x and point y

请注意,该指标的最佳(最小)解决方案基本上是通过所有点的最佳(最短)路径。这是Traveling Salesman Problem (TSP),也就是NP-Hard,所以没有已知的多项式解决方案

我建议 - 首先准确定义比较两个数组的度量标准。
然后,对指标使用启发式或近似值,例如 Genetic Algorithmshill climbing,或将问题简化为 TSP,并为其使用已知的启发式/近似值。

关于你的方法: 很容易看出它对于这个简单的例子来说不是最优的:

[(1,100),(1,-100),(2,0)]

假设主排序按x,次要排序按y
它会给我们“排序”的向量:

[(1,-100),(1,100),(2,0)]

根据上述指标,我们得到metric(arr) ~= 300

但是,[(1,-100),(2,0),(1,100)] 的订单将得到我们metric(arr) ~= 200

因此,建议的启发式不是最优的(如预期的那样)。

【讨论】:

  • 我需要近似排序和非常快速的排序。所以我需要一个对性能影响最小的指标。
【解决方案2】:

【讨论】:

  • 这不是最近邻问题。 NN是关于从最接近单个点的样本中找到一个点。在这里 - 问题是关于许多点之间的优化排序。如果您认为问题有某种关联,请说明如何使用 NN 减少问题,然后链接到您的文章,说明如何使用减少的问题。
  • 只是猜测-抱歉。
【解决方案3】:

CGAL 库提供了一个空间填充曲线算法的implementation,可用于该任务。

【讨论】:

    【解决方案4】:

    在三个轴上排序三次是浪费。第三类将完全撤销其他类所做的。

    【讨论】:

    • 您并没有告诉我们“物理上更接近的点也应该在我的阵列内更接近”背后的动机。知道这一点可能会让我们提供更具建设性的答案。空间填充曲线根本没有这个属性!
    • 我认为你对空间填充曲线的看法是不对的。我的陈述背后有 3 个主要动机: 1. 改善内存局部性:内存中的空间接近点意味着更高的空间局部性……这意味着更好地利用 cpus 上的缓存……gpus 它将改善内存合并。 2. 易于域分解:通常一些计算会与点相关联,通过对点进行空间排序,可以很容易地在 cpus/gpus 上的线程之间拆分计算。 3.改善负载平衡:这是另一个可以改善某些并行算法的因素。
    • 看一张希尔伯特曲线的图片,考虑中间的四个点。其中两个是直接邻居。其他两个由 length/4 或 length/2 分隔,即你能找到的最差的。
    • 我最好依靠点的 k-means 分组,其中 k 取决于您的应用程序。
    猜你喜欢
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多