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

What is the best way to get a permutation index list of a given vector

本文关键字:列表 最佳 方法 是什么 索引 排列 向量      更新时间:2023-10-16

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

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();

这使我不能重新审视我之前已经找到的要点。可悲的是,对于100万点的实例,这个过程超过了我的时间限制,我不希望解决方案的导出时间比解决问题本身要多。有没有一种方法可以有效获取C 中某些向量的预先征用的索引?如果需要,该解决方案可以使用很多内存。

实现的易于实现,并且非常有效的解决方案是创建一个临时std::unordered_map<Point,size_t>,其中键是original内的点和值位置,然后在该地图中查找。有关如何使用您(或提供的库(数据类型作为std::unordered_map中的键的详细信息

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