对坐标 c++ 的向量进行排序

Sorting a vector of coordinates c++

本文关键字:排序 向量 坐标 c++      更新时间:2023-10-16

我有一个图,其中给定一个节点,我必须生成图中所有其他节点的有序向量,按最近距离排序。

因此,我有一个包含所有坐标的向量和一个单独的坐标,以将其与所有其他坐标进行比较。我的想法是创建一个地图,该地图将保存任何坐标(节点),一个按最接近位置排序的所有其他坐标的向量。

我可以使用 std::sort 来做到这一点吗?或者有什么方法可以简化这一点?

谢谢

假设你的节点是全局的,你可以做这样的事情

#include <vector>
#include <iostream>
#include <utility>
std::pair<float,float> MyNode(10,20);
struct CalculateDistance{
    float operator()(std::pair<float,float> temp) {
        //Use MyNode to calculate the distance between MyNode and temp and return it
    }
};
int main(){
    std::vector<std::pair<float,float> > listOfCoordinates;
    listOfCoordinates.push_back(std::make_pair(10.20,30.2));
    listOfCoordinates.push_back(std::make_pair(9.20,31.2));
    listOfCoordinates.push_back(std::make_pair(12.20,39.2));
    listOfCoordinates.push_back(std::make_pair(15.20,-30.2));
    std::vector<float> distances;
    std::copy(listOfCoordinates.begin(),listOfCoordinates.end(),distances.begin(),CalculateDistance());
    std::sort(distances.begin(),distances.end());
}

但这只是一种方式,您应该发布一些代码或更具体,以便有人可以帮助您。我没有进行实际计算,CalculateDistance()应该返回一个代表距离的浮点数。我没有编译我的代码,只是为了向您展示主要思想。

如果要保持节点和距离之间的关系,可以执行以下操作:

typedef std::pair<float,float> Coordinate;
typedef float Distance;
typedef std::pair<Coordinate,Distance> Node;

并使用节点向量

我可以使用 std::sort 来做到这一点吗?

我认为你走错了方向.如果你保留一个包含所有节点坐标的向量,并将它们排序为与当前节点距离的基础,它不一定会比较给定向量中的 2 个坐标!
这是std::sort 所要求的。
为了克服这个问题,你需要预先计算所有节点与给定节点的距离,然后定义std::sort()compare()函数,它基于最小距离进行比较。
总时间复杂度 : O(N logN) .

或者有什么方法可以简化这一点?

相反,有一种更简单的方法.
给定你的节点,使用队列做广度优先搜索。执行BFS时,您首先访问距离原始节点1的所有节点,然后在距离2处访问,依此类推....这正是所需要的.
总时间复杂度 : O(N) .

希望这有帮助!