我在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 是否会在空间上完美排序(或几乎在空间上排序)?
其次,如果这种方法是正确的,它是最快的方法吗?有什么更好的方法可以做到这一点?
答案 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 Algorithms或hill 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)
在三轴上排序三次是浪费。第三种方法将彻底撤消其他种类所做的事情。