获取给定向量的排列索引列表的最佳方法是什么

时间:2019-05-23 17:02:02

标签: c++ std stdvector

在我的应用程序中,我解决了给定点列表上的几何问题。

0 x0 y0
1 x1 y1
...

解决方案文件应包含点的特定顺序,并以其索引列表的形式表示。

1
0
...

解决问题后,我得到了一个按一定顺序排列的点对象的result = std::vector<Point>()向量,以及一个原始的original = std::vector<Point>()向量点列表。两个向量自然具有相同的大小。为了生成输出文件,我浏览了result向量,并在original向量中搜索了点的索引。这是非常低效的,因为它确实需要O(n^2)时间。作为一点改进,我执行以下操作:

std::ofstream out(filename);

std::vector<int> indices(instance.size);
std::iota(indices.begin(), indices.end(), 0);

for(auto &point : instance.result.points)
{
    for(std::size_t i=0; i<indices.size(); i++)
    {
        int id = indices[i];
        if(point == instance.points[id])
        {
            out << id << std::endl;
            indices.erase(indices.begin()+i);
            break;
        }
    }
}

out.close();

这使我不必再访问以前已经发现的要点。可悲的是,对于一百万个点的实例,此过程超出了我的时间限制,我不希望我的解决方案的导出花费比解决问题本身更多的时间。有没有一种方法可以有效地获取C ++中某些矢量的预突变索引?如果需要,该解决方案可以使用大量内存。

2 个答案:

答案 0 :(得分:2)

一种易于实现且非常有效的解决方案之一是创建一个临时std::unordered_map<Point,size_t>,其中键是点,值是original内的位置,然后在该图中进行查找。 std::unordered_map提供的here

中如何使用您(或提供的库)数据类型作为键的详细信息

答案 1 :(得分:1)

除了位置之外,您还可以扩展Point结构以包含原始ID。