快速方式部分排序对象

时间:2012-04-26 21:20:19

标签: c++ boost-ptr-container

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

  1. boost::ptr_vector<Jet>使用内置的.sort(),取前两个
  2. boost::ptr_list<Jet>,使用.sort(),前两个
  3. 使用上面的列表,但不是排序,而是使用max_element,删除元素,然后再次运行。
  4. 我认为使用std::vector<Jet>是最糟糕的选择,因为:我不需要随机访问;排序会在内存中移动对象;调用push_back(Jet)时将复制对象。由于需要复制,我还假设std::list<Jet>会比boost::ptr_list<Jet>更糟糕。我进一步假设两次取max_element比整个列表排序要快。

    我的逻辑是否合理?性能差异是否显着?还有其他一些我没想到的选择吗?

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

有一个standard library algorithm可以做到这一点:

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)。)

答案 2 :(得分:1)

如果您需要最低的两个对象,您可以创建自己的搜索功能,该功能将在O(N)时间内运行。使用sort是O(N log N)时间。