我的代码的 space 复杂度是多少?
What is the space complexity of my code?
我对时间复杂度很满意,但对 space 复杂度还不是很满意。我有以下关于 space 复杂性的问题:
unordered_set<int> s;
for(auto& i : nums)
s.insert(i);
根据我的理解,上面代码片段的space复杂度是O(n)
(n
是输入向量中的元素个数nums
)因为我在 for 循环外创建集合并在其中插入最多 n
个元素。
但是,如果我在 for 循环中创建集合,例如:
for(auto& i : nums) {
unordered_set<int> s;
s.insert(i);
}
那么在这种情况下,我的 space 复杂度会再次变为 O(n)
吗?我知道我在做什么是不同的(每次创建一个新集合并只在其中插入一个元素),但我只是对 space 复杂性感到好奇。
简而言之,space 复杂度是否仅取决于在数据结构中插入了多少元素,或者还取决于使用了多少数据结构(例如在循环中创建它们)。
谢谢。
第二种情况 space 复杂度为 O(1)
,第一种情况为 O(n)
。
第二种情况..
如果你每次声明一个局部unordered_set
然后你压入1个元素时考虑循环中的第二种情况。然后那不被使用,又一次迭代。最多使用 1
或恒定数量的 space。
第一种情况..
在第一种情况下,您使用 set
然后插入元素。您最多插入 n
个元素。这就是为什么 O(n)
.
一些定义
For every size of the input the algorithm will take the some amount
of space. Without over complicating you can say that maybe it is used
store the output or some work that you need to do intermediately. How
many data structures you use is not the concern rather the space used
by them is.
space 复杂性涉及找出随着输入大小的变化算法需要多少(额外)space。
现在让我们检查一件事,假设您在第一种情况下将输入数量从 n=100
增加到 n=100000
,那么您将需要多少额外内存。正如您将看到的那样,它呈线性增长。 (之前 100
输入 100
个集合元素,现在 100000
)。
第二种情况,你需要吗?您总是只使用 1
space。(恒定数量的 space)。然后你丢弃它。在新的迭代中,您与另一个 space 一起工作。一次只有 1
元素在那里。所以无论输入是什么,它总是相同的。
更清楚地说,如果您在每次迭代中使用插入 3
元素,它不会改变 space 复杂度。这仍然是 O(1)
时间复杂度表示它使用恒定数量的 space (与输入大小无关)。
第二种情况,每个unordered_set
在循环体结束后不复存在。一个明智的实现将对所有集合重复使用相同的 space,并且它们只包含一个元素。
如果您将其用作 space 复杂性指标,则第一种情况需要 O(n)
额外 space,第二种情况需要 O(1)
额外 space 需要
Space 复杂性告诉您算法使用了多少内存。
在第二种情况下,您只将一个元素插入 s
。紧接着 s
超出范围,您开始新的迭代。这意味着您实际上一次只使用一个内存单元。 n
不会增加内存使用量。因此你有 O(1)
.
在第二种情况下,你的复杂度是 O(1)
。
每次迭代只会使用一次set
,然后将被释放。
一般来说,复杂程度取决于您的程序所需的总 space。
在你的情况下,你将使用 n
次大小为 1 的集合,但它不会累积。
space 复杂度衡量算法所需存储量相对于输入大小的扩展程度。
假设你插入n
个唯一整数,std::unordered_map
确实需要分配足够的存储空间来存储n
个节点,此外还有一些不受数字影响的常量值您插入其中的整数。因此,space 复杂度确实是 O(n)。
在您的第二个示例中,无论 num
中有多少整数,您总是会为 std::unordered_set
中的一个整数分配足够的存储空间。因此,您的 space 复杂度为 O(1)。
从复杂性的角度来看,存储供应是无限的,重要的是您同时使用了多少。
考虑测量X桶水的问题。
对 space 复杂度没有影响
- 有一个桶,先装满,然后清空,再装满,然后清空,...,或者
- 装满一个桶然后丢弃那个桶,然后装满另一个桶然后扔掉,...
因为您在任何给定时间总是最多使用一个存储桶。
桶本身不计入复杂性,只计入您同时持有的数量。
另一方面,如果您没有一个桶,而是装满了 X 个桶(也许您想为即将到来的干旱节约用水),space 复杂度将为 O(X)。
我对时间复杂度很满意,但对 space 复杂度还不是很满意。我有以下关于 space 复杂性的问题:
unordered_set<int> s;
for(auto& i : nums)
s.insert(i);
根据我的理解,上面代码片段的space复杂度是O(n)
(n
是输入向量中的元素个数nums
)因为我在 for 循环外创建集合并在其中插入最多 n
个元素。
但是,如果我在 for 循环中创建集合,例如:
for(auto& i : nums) {
unordered_set<int> s;
s.insert(i);
}
那么在这种情况下,我的 space 复杂度会再次变为 O(n)
吗?我知道我在做什么是不同的(每次创建一个新集合并只在其中插入一个元素),但我只是对 space 复杂性感到好奇。
简而言之,space 复杂度是否仅取决于在数据结构中插入了多少元素,或者还取决于使用了多少数据结构(例如在循环中创建它们)。
谢谢。
第二种情况 space 复杂度为 O(1)
,第一种情况为 O(n)
。
第二种情况..
如果你每次声明一个局部unordered_set
然后你压入1个元素时考虑循环中的第二种情况。然后那不被使用,又一次迭代。最多使用 1
或恒定数量的 space。
第一种情况..
在第一种情况下,您使用 set
然后插入元素。您最多插入 n
个元素。这就是为什么 O(n)
.
一些定义
For every size of the input the algorithm will take the some amount of space. Without over complicating you can say that maybe it is used store the output or some work that you need to do intermediately. How many data structures you use is not the concern rather the space used by them is.
space 复杂性涉及找出随着输入大小的变化算法需要多少(额外)space。
现在让我们检查一件事,假设您在第一种情况下将输入数量从 n=100
增加到 n=100000
,那么您将需要多少额外内存。正如您将看到的那样,它呈线性增长。 (之前 100
输入 100
个集合元素,现在 100000
)。
第二种情况,你需要吗?您总是只使用 1
space。(恒定数量的 space)。然后你丢弃它。在新的迭代中,您与另一个 space 一起工作。一次只有 1
元素在那里。所以无论输入是什么,它总是相同的。
更清楚地说,如果您在每次迭代中使用插入 3
元素,它不会改变 space 复杂度。这仍然是 O(1)
时间复杂度表示它使用恒定数量的 space (与输入大小无关)。
第二种情况,每个unordered_set
在循环体结束后不复存在。一个明智的实现将对所有集合重复使用相同的 space,并且它们只包含一个元素。
如果您将其用作 space 复杂性指标,则第一种情况需要 O(n)
额外 space,第二种情况需要 O(1)
额外 space 需要
Space 复杂性告诉您算法使用了多少内存。
在第二种情况下,您只将一个元素插入 s
。紧接着 s
超出范围,您开始新的迭代。这意味着您实际上一次只使用一个内存单元。 n
不会增加内存使用量。因此你有 O(1)
.
在第二种情况下,你的复杂度是 O(1)
。
每次迭代只会使用一次set
,然后将被释放。
一般来说,复杂程度取决于您的程序所需的总 space。
在你的情况下,你将使用 n
次大小为 1 的集合,但它不会累积。
space 复杂度衡量算法所需存储量相对于输入大小的扩展程度。
假设你插入n
个唯一整数,std::unordered_map
确实需要分配足够的存储空间来存储n
个节点,此外还有一些不受数字影响的常量值您插入其中的整数。因此,space 复杂度确实是 O(n)。
在您的第二个示例中,无论 num
中有多少整数,您总是会为 std::unordered_set
中的一个整数分配足够的存储空间。因此,您的 space 复杂度为 O(1)。
从复杂性的角度来看,存储供应是无限的,重要的是您同时使用了多少。
考虑测量X桶水的问题。
- 有一个桶,先装满,然后清空,再装满,然后清空,...,或者
- 装满一个桶然后丢弃那个桶,然后装满另一个桶然后扔掉,...
因为您在任何给定时间总是最多使用一个存储桶。
桶本身不计入复杂性,只计入您同时持有的数量。
另一方面,如果您没有一个桶,而是装满了 X 个桶(也许您想为即将到来的干旱节约用水),space 复杂度将为 O(X)。