空间排序在3d空间中的百万点

时间:2014-04-01 08:07:37

标签: algorithm sorting 3d computational-geometry

我在3d空间中收集了百万点。

每个点都是一个对象

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

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

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

我对如何执行此操作的第一个猜测如下:首先对W轴进行Z轴分类,然后沿Y轴对点进行排序,然后沿X轴对点进行排序

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

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

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

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

嗯,这实际上取决于您将用于比较两个数组之间的指标,但请查看指标,即相邻点之间的差异总和:

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 :(得分:0)

答案 3 :(得分:0)

在三轴上排序三次是浪费。第三种方法将彻底撤消其他种类所做的事情。