在 C++ 中生成对的排序向量的有效方法
Efficient way to generate sorted vector of pairs in C++
我正在尝试从一组整数生成排序向量 std::vector<std::pair<int,int>>
。通过迭代整数集,整数的值将被设置为该对的第一个值,该对的第二个值将由另一个函数计算。所有对都应根据我的最终向量中的第二个值进行排序。为此,我有两个生成向量的计划:要么我将这对“插入”到正确的位置(通过从向量开始迭代并比较第二个值),要么我简单地进行推回和排序(通过 std::sort
带有一些比较功能)所有对被推入后的整个向量。那么哪种方案效率更高呢? (或者有更好的方法?)
生成整个 vector
并作为最后一步进行排序几乎肯定是可行的方法。假设生成的值是半随机的,尝试插入以保持排序顺序将涉及不断增长的 O(n)
插入成本(O(log n)
二进制搜索成本在理论上不是一个问题,但考虑到半-随机访问,在实践中可能比插入成本更糟糕),使整体构建时间 O(n²)
(n
插入成本 O(n)
每个工作)。
相比之下,生成整个事物并在最后排序是 O(n)
构建 vector
,O(n log n)
对其进行排序。
只有当您要将少量项目插入到现有的大型 vector
中时,才考虑以保留顺序插入其中。当然,如果你在那种情况下,你可能最好使用 std::set
或 std::multiset
(或者在这种情况下,std::multimap<int, int>
将生成的值映射到 int
生成它们)以使修改工作始终如一 O(log n)
每次操作。
我正在尝试从一组整数生成排序向量 std::vector<std::pair<int,int>>
。通过迭代整数集,整数的值将被设置为该对的第一个值,该对的第二个值将由另一个函数计算。所有对都应根据我的最终向量中的第二个值进行排序。为此,我有两个生成向量的计划:要么我将这对“插入”到正确的位置(通过从向量开始迭代并比较第二个值),要么我简单地进行推回和排序(通过 std::sort
带有一些比较功能)所有对被推入后的整个向量。那么哪种方案效率更高呢? (或者有更好的方法?)
生成整个 vector
并作为最后一步进行排序几乎肯定是可行的方法。假设生成的值是半随机的,尝试插入以保持排序顺序将涉及不断增长的 O(n)
插入成本(O(log n)
二进制搜索成本在理论上不是一个问题,但考虑到半-随机访问,在实践中可能比插入成本更糟糕),使整体构建时间 O(n²)
(n
插入成本 O(n)
每个工作)。
相比之下,生成整个事物并在最后排序是 O(n)
构建 vector
,O(n log n)
对其进行排序。
只有当您要将少量项目插入到现有的大型 vector
中时,才考虑以保留顺序插入其中。当然,如果你在那种情况下,你可能最好使用 std::set
或 std::multiset
(或者在这种情况下,std::multimap<int, int>
将生成的值映射到 int
生成它们)以使修改工作始终如一 O(log n)
每次操作。