【问题标题】:Profiling stable_sort分析 stable_sort
【发布时间】:2015-05-30 17:17:41
【问题描述】:

这个page 告诉我们,只要内存不足,stable_sort 就会减少到运行时间为 O(n(log n)(log n)) 的就地算法:

复杂性

如果有足够的额外内存可用,第一个和最后一个之间的距离是线性的:执行最多 N*log2(N) 个元素比较(其中 N 是这个距离),并且最多元素移动。 否则,该距离内的多对数线性:最多执行 N*log22(N) 次元素比较,以及最多多次元素交换。

我想针对另一个具有相同运行时间的就地算法对其进行分析,所以我的问题简化为:如何模拟“内存不足”以便在stable_sort 中执行较慢的算法?

【问题讨论】:

标签: c++ sorting memory in-place


【解决方案1】:

cplusplus.com 是出了名的糟糕...查看 cppreference.com 的描述 here

此函数尝试分配一个大小与要排序的序列相等的临时缓冲区,通常通过调用 std::get_temporary_buffer。如果分配失败,则选择效率较低的算法。

get_temporary_buffer 是:

template< class T >
std::pair< T*, std::ptrdiff_t > get_temporary_buffer( std::ptrdiff_t count )

因此,虽然在 std 命名空间中为您自己的类专门化它在技术上是欠完善的行为,但您可能不会对生产代码执行此操作,实际上它极有可能可靠地工作并且会让您拦截内存请求和返回失败。

namespace std
{
    template <>
    std::pair<My_Class*, std::ptrdiff_t>
    get_temporary_buffer(std::ptrdiff_t)
    { return {0, 0}; }
}

【讨论】:

  • 赞成说 “cplusplus.com 臭名昭著”。我今天没票了。
  • @πάνταῥεῖ 哇哦 - 我什至不知道有可能用完赞成票;你一定比我大方!干杯。
  • 您的选票已经用完了。无论您投赞成票还是反对票都没关系。我今天大部分时间都投了反对票。现在还剩一个。它会通过删除的问题恢复。我不知道确切的机制。
猜你喜欢
  • 2012-04-04
  • 2020-09-14
  • 1970-01-01
  • 2014-07-22
  • 2013-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
相关资源
最近更新 更多