【问题标题】:What is the best way to get a permutation index list of a given vector获取给定向量的排列索引列表的最佳方法是什么
【发布时间】: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&lt;Point,size_t&gt;并在那里查找。
  • 遗憾的是点对象不可散列。
  • 为什么它不可散列?如果这是重点(我几乎不怀疑),请改用std::map。不要说他们没有可比性

标签: c++ std stdvector


【解决方案1】:

实现简单且非常有效的解决方案之一是创建一个临时的std::unordered_map&lt;Point,size_t&gt;,其中键是点,值是original 内的位置,然后在该映射中进行查找。在std::unordered_map 提供的here 中,有关如何使用您的(或库提供的)数据类型作为键的详细信息

【讨论】:

  • 是的,当我自己实现哈希函数时,它确实适用于std::map 以及std::unordered_map。两种选择都满足我的需求。谢谢!
【解决方案2】:

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

【讨论】:

  • 对于我的具体任务,我无法控制点结构,因为它是由外部库提供的。
  • 但是当我将自定义结构传递给外部库时,它会自动切断额外的size_t 还是我弄错了?
  • 不一定。如果它是开源的,您能否分享有关您使用的库/您调用的方法的更多详细信息?另外,Point 类型是什么,它包含什么?可以扩展它以添加索引。
  • 我正在使用 CGAL 来执行一些几何运算。因此,我将Kernel::Point_2 用于某些(用户定义的)内核。 std::map 解决方案对我来说确实足够好。还是谢谢你!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-26
  • 1970-01-01
  • 2012-09-23
  • 1970-01-01
  • 2015-05-05
  • 2021-01-14
相关资源
最近更新 更多