【问题标题】:What's the memory complexity of std::sort() and std::sort_heap()?std::sort() 和 std::sort_heap() 的内存复杂度是多少?
【发布时间】:2014-10-09 19:37:48
【问题描述】:

如标题所示 - std::sort()std::sort_heap() 的内存复杂度是多少? (后者需要std::make_heap(),所以我也想知道它的内存复杂度。)

我尝试在这些网站上搜索:http://www.cplusplus.com/reference/http://en.cppreference.com/w/,但要么我错过了它,要么他们只提到了时间复杂度。是否在任何地方(在 C++ 标准或其他文档中)指定了所述函数的内存复杂性?或者这可能取决于实现?

【问题讨论】:

  • 所有三种算法都是就地的,即额外的内存是 O(1)。
  • 快速排序非常到位。数据永远不会移动到外部数据存储中。数据永远不会放在堆栈上。关于您在容器中的位置的参数可能会放在堆栈上。您可以争论内存是否为 O(1),但不能争论是否就地。
  • intro-sort 不是。
  • 该标准对内存成本没有要求。一个假设的一致性实现可以仅为 lulz 分配 O(2^N) 内存,尽管没有理智的库编写者会这样做。

标签: c++ c++11 big-o c++-standard-library space-complexity


【解决方案1】:

对于std::sort(),我在 Cboard 上找到了一个答案,上面写着:

实施质量问题。不同的实现比其他实现更有效地使用内存。除此之外,该标准允许针对不同的迭代器类别对std::sort 进行专门化,只要复杂性(时间)符合要求,实现就可以在几个不同的选项之间进行选择。给出的复杂性甚至不是时间,而是比较的次数。该实现可以执行 N³ 交换操作。

std::sort 的大多数实现的内存开销与递归深度和每个递归级别存储到堆栈中的局部变量的数量有关。 std::sort 的 HP / Microsoft STL 实现使用快速排序,直到/除非它检测到递归级别变得太深,在这种情况下它切换到堆排序。如果大小很小,例如 32 或更小,则使用 Insertionsort。

您可以在 Wikipedia page 中查看算法的比较,并估算内存复杂度。

同样,我怀疑其他两种算法也属于同样的情况。

【讨论】:

  • 给出的复杂性甚至不是时间,而是比较次数。该实现可以执行 N^3 个交换操作。
  • 我相信标准要求std::sort及时成为O(n*log(n)),虽然我现在不能引用。
  • 我同意 dyp。 NPS 我找不到支持你评论的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-31
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
  • 2014-11-29
  • 2020-10-13
  • 2021-06-17
相关资源
最近更新 更多