快速方法部分排序对象

fast way partially sort objects

本文关键字:排序 对象 方法部      更新时间:2023-10-16

我有一个例程,在其中我定义了一堆对象(大约 20 个),将它们称为 Jet ,它们有一个定义<,我用它来对它们进行排序。排序后,我选择最低的两个。什么是快速的方法?到目前为止,我想到的选项:

  1. boost::ptr_vector<Jet>使用内置的.sort(),取前两个,
  2. boost::ptr_list<Jet>,使用.sort(),取前两个
  3. 使用上述列表,但不进行排序,而是使用 max_element ,删除元素,然后再次运行。

我认为使用std::vector<Jet>是最糟糕的选择,因为:我不需要随机访问;排序将在内存中移动对象;调用push_back(Jet)时将复制对象。由于需要复制,我也认为std::list<Jet>会比boost::ptr_list<Jet>更糟糕。我进一步假设两次max_element比对整个列表进行排序更快。

我的逻辑合理吗?性能差异会很大吗?还有其他我没有想到的选择吗?

你的一个假设是正确的,因为存储指针而不是对象会更快。

但是,如果您只需要两个最小的元素,则无需对任何内容进行排序。只需获取前两个元素,然后遍历vectorlist的元素并保留较小的元素。

有一个标准的库算法可以做到这一点:

std::vector<Jet> v;
// populate v
std::partial_sort(v.begin(), v.begin() + 2, v.end());

v[0]现在是最小的元素,v[1]现在是第二小的元素;其余元素的顺序未指定。 std::vector<>可以用std::deque<>代替,因为后者也有随机访问迭代器。

(请注意,我链接到的页面上提到的复杂性是不正确的;C++11 §25.4.1.3 说复杂性(last - first) * log(middle - first) .)

如果需要最少的两个对象,可以创建自己的搜索函数,该函数将在 O(N) 时间内运行。使用排序是 O(N log N) 时间。