std :: stable_sort:如何在时间优化算法中选择内存优化算法?

时间:2017-07-06 11:22:27

标签: c++ sorting std c++17 stable-sort

我希望利用std::stable_sort。算法的复杂性表示为

  

O(N·log ^ 2(N)),其中n = std :: distance(first,last)cmp的应用。如果有额外的内存,则复杂度为O(N·log(N))。 http://en.cppreference.com/w/cpp/algorithm/stable_sort

在我的应用程序中,内存至关重要,因此,我更希望std::stable_sort使用内存优化的O(N·log ^ 2(N)) 算法,而不是时间优化的O(N·log(N))算法。 我知道时间优化的版本只有在安全的情况下才会被选中 这样做(可用内存)。但是,我的目标是对我的应用程序进行基准测试,因此,当内存非常重要时,需要在内存消耗最低时对算法进行基准测试。因为我的系统目前有足够的内存来分配 缓冲区,它将自动选择std::stable_sort的O(N·log ^ 2(N))版本。因此,我想向std::stable_sort断言 采用内存优化版本。这可能吗?

出现执行政策 它是一个可以修改算法的参数,但它会出现 只改变并行程度。 http://en.cppreference.com/w/cpp/algorithm/execution_policy_tag_t

虽然选择其中之一 并行或顺序版本实际上可能是选择O(N·log(N))或 O(N·log ^ 2(N))版本分别在网页的任何地方都没有说明。

我想知道是否有人有任何断言这种选择的经验。如果是这样 他们能提供任何建议吗?

2 个答案:

答案 0 :(得分:14)

如果额外缓冲区不可用,您可以查看标题并查看调用哪个函数。对我来说,gcc就是

    std::__inplace_stable_sort(__first, __last, __comp);

这当然不符合标准。 __inplace_stable_sort是一个辅助函数,不能直接使用。

std :: stable_sort对此函数的调用是以下代码

的结果
typedef _Temporary_buffer<_RandomAccessIterator, _ValueType> _TmpBuf;
  _TmpBuf __buf(__first, __last);

  if (__buf.begin() == 0)
std::__inplace_stable_sort(__first, __last, __comp);
  else
std::__stable_sort_adaptive(__first, __last, __buf.begin(),
                _DistanceType(__buf.size()), __comp);

答案 1 :(得分:7)

不幸的是,没有标准方法告诉stable_sort进行就地排序。在C ++ 14中我们唯一的选择

template<class RandomAccessIterator>
void stable_sort(RandomAccessIterator first, RandomAccessIterator last);

template<class RandomAccessIterator, class Compare>
void stable_sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);

C ++ 17添加了允许执行策略的版本,但是这些版本也不会影响决策。如果我们看一下[stable.sort]中的复杂性要求,我们得到

  

复杂性:它最多只会N log²(N)(其中N == last - first)比较;如果有足够的额外内存,则为N log(N).

因此,如果可用,则需要使用更多内存。

您需要自己编写,您可以查看Worst case O(nlnn)O(nln⁡n) in place stable sort?或找到为您提供此功能的库。