空向量向量的空间复杂度是多少?

问题描述

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

alias

解决方法

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

一个 vector 内部,由两部分组成:

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

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

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

  • vector<vector<int>> 的本地部分
  • 一个远程部分,由 N 个(其中是向量的容量)“vector<int>”的本地部分组成。
  • 每个 vector<int> 都可以有一个远程部分(可以为空)。

这是否回答了您的问题?

,

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

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

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