【问题标题】:Fastest way to concatenate two large QVector's and sort them (C++/Qt)连接两个大型 QVector 并对它们进行排序的最快方法 (C++/Qt)
【发布时间】:2016-05-19 00:40:59
【问题描述】:

将两个已排序的大型QVector 连接到一个已排序的QVector 中的最佳(最快)方法是什么?

我有以下代码:

class Square
{
    .....
    qint32 id; //public
    .....
}

QVector <Square> v_one; //size 10000+
QVector <Square> v_two; //size 10000+

我的v_onev_two 已经按“id”排序。

如何通过 id 排序将这两个向量合并到其中一个向量(例如v_one = v_one + v_two)中。

我认为我必须将其作为一个动作(排序和合并)来执行,而不是一个接一个?

谢谢!

【问题讨论】:

  • cplusplus.com/reference/algorithm/merge(要么直接使用它,要么重新实现其中描述的算法)。
  • @MatteoItalia 看起来会非常慢,不是吗?
  • 我会使用合并排序进行多线程处理。两个向量的连接不能加速太多,但是可以通过使用系统上的多个核心来进行排序 => 合并排序非常适合并行排序。
  • @VoronkovIvan:参数总数为 O(n) 与任何“常规”基于排序的解决方案的 O(n log n) 相比,你不会渐近地击败这个。顺便说一句,如果我们谈论 n~10000 任何东西都可以,对于任何 cpu 来说这都是非常小的东西。

标签: c++ qt sorting concatenation qvector


【解决方案1】:

如果你想将它们合并到两个向量之一,我建议std::inplace_merge

auto size_one = v_one.size();
v_one += v_two;
std::inplace_merge(v_one.begin(), v_one.begin() + size_one, v_one.end(), 
  [](Square const &a, Square const &b) -> bool
  { return a.id < b.id; });

对于并行执行:实验性的C++ Extensions for Parallelism, ISO/IEC TS 19570:2015 具有std::experimental::parallel::inplace_merge,这可能会在未来某个时间成为标准的一部分。您可以在CodePlex Parallel STL project 中找到implementation for the parallel merge algorithms,这是并行扩展的 Microsoft 原型。


编辑:

可以使用std::unique来去除重复。

auto new_end = std::unique(v_one.begin(), v_one.end(), 
  [](Square const &a, Square const &b) -> bool
  { return a.id == b.id; });
v_one.erase(new_end, v_one.end());

【讨论】:

  • std::inplace_merge 是多线程的吗?因为如果不是,我宁愿将第二个向量连接到第一个向量,然后使用多线程合并排序对整个事物进行排序。
  • 看起来很结实。我一定会试试这个。非常感谢!
  • @rbaleksandar 多线程合并排序线程各个合并。这是一个单独的合并,不适合线程化。
  • 我想我的表达可能不正确。 OP 想要将第二个向量添加到第一个向量(反之亦然,或者创建一个包含两者的所有元素的新向量)。为此使用线程是没有意义的。接下来的排序可以通过多线程合并排序完成,即合并排序应用于由两个向量组成的新创建的值集。
  • @rbaleksandar:Imo 两个排序向量的合并可以被视为整个范围的合并排序而不是合并排序的最后合并步骤。对整个范围应用合并排序会将整个范围重新划分为子范围并尝试对它们进行排序,如果 v_onev_two 已经排序,则这是没有意义的。
猜你喜欢
  • 2017-09-14
  • 2022-10-04
  • 1970-01-01
  • 2011-12-30
  • 2023-03-18
  • 2010-10-22
  • 1970-01-01
  • 2019-08-09
  • 1970-01-01
相关资源
最近更新 更多