【发布时间】:2019-05-23 17:02:01
【问题描述】:
在我的应用程序中,我解决了给定点列表的几何问题。
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>并在那里查找。 -
遗憾的是点对象不可散列。
-
为什么它不可散列?如果这是重点(我几乎不怀疑),请改用
std::map。不要说他们没有可比性