【问题标题】:What is the space complexity of a vector of empty vectors?空向量向量的空间复杂度是多少?
【发布时间】:2020-12-22 23:34:15
【问题描述】:

考虑到向量包含的所有向量都是空的,空间复杂度是 O(n) 还是 O(1)?

vector<vector<int>> mat(n);

【问题讨论】:

  • 我不认为标准禁止实现让空向量预分配块
  • 我认为标准要求默认构造函数为 noexcept,这(通常)排除了分配。
  • @MarshallClow - 它不排除分配,但它确实塑造/限制了分配失败时会发生什么。如果分配失败,则调用std::abort() 从技术上讲,允许函数为noexcept。此外,相当多的操作系统会进行惰性分配 - 代码可能会请求分配,系统实际上并没有执行分配,一些后续代码尝试使用分配的内存,然后系统承诺执行分配,分配失败,然后才可能抛出异常。这种类型的惰性分配在实践中确实会发生。
  • 技术上正确,是的,但这对图书馆的用户没有用。

标签: c++ c++-standard-library space-complexity


【解决方案1】:

我不太确定您所说的“空间复杂度”是什么意思,但我会试一试。

内部的vector,由两部分组成:

  • 当您声明类型为vector&lt;int&gt; 的局部变量时,在堆栈上分配的“局部部分”。这部分是固定大小的——它不会根据向量中元素的数量而改变。在许多实现中,这是三个指针 + 一个分配器的大小。

  • “远程部分”(通常)位于堆上,但使用分配器进行分配。这会根据向量的容量改变大小。不是大小,而是容量(容量总是至少与大小一样大,但可能更大)。一个空向量(容量 == 0)可能没有“远程部分”。

因此,空向量的向量将具有以下空间使用情况:

  • vector&lt;vector&lt;int&gt;&gt; 的本地部分
  • 一个远程部分,由 N 个(这是向量的容量)“vector&lt;int&gt; 的本地部分”组成。
  • 每个vector&lt;int&gt;s 都可以有一个远程部分(可以是空的)。

这能回答你的问题吗?

【讨论】:

    【解决方案2】:

    空向量是存在的对象,因此会占用存储空间。外层向量并不真正关心它存储什么,标准要求向量连续存储元素并且每个元素都是一个不同的对象。

    因此,从外部向量的角度来看,您可以将内部向量替换为 int,并且没有太大变化 - 向量仍然包含 N 个元素。如果这些元素为空 vector&lt;int&gt;,它们将大于 int,但复杂度不会改变:存在 N 个对象。

    内部向量是否分配甚至都没有关系。这只会给内存成本增加一些常数因素,总成本保持在同一个 O(N) 类中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-07
      • 1970-01-01
      • 1970-01-01
      • 2014-01-01
      • 2015-06-06
      • 2020-03-10
      • 2018-07-23
      相关资源
      最近更新 更多