【问题标题】:What is the space complexity of a list in a while loop?while 循环中列表的空间复杂度是多少?
【发布时间】:2022-01-19 11:23:42
【问题描述】:

我相信 similar question 已被要求用于 Java,但我不确定这是否同样适用于 Python,因为我们没有明确使用 new 关键字

对于这个特定的代码:

x = 5
while (x > 0):
  arr = []
  arr2 = []
  arr.append(1)
  arr2.append(2)
  x -= 1

执行完这段代码后,会不会一共创建10个不同的list,空间复杂度O(10),还是只会创建2个list,空间复杂度O(2 )。 我知道整体空间复杂度仍然是 O(1),但只是想了解幕后发生了什么。

【问题讨论】:

  • O(2) = O(10) = O(1)。而且空间复杂度不仅仅取决于创建的列表的数量
  • 从技术上讲,您将获得 10 个列表,但除了最后两个之外,它们最终都会被垃圾回收

标签: python list while-loop space-complexity


【解决方案1】:

首先,由于您在 while 循环中编写了 arr = [],它将重写前一个数组,因此 arrarr2 最多只有 1 个元素

其次,随着 Big-O 复杂度的正式定义,O(1) 和 O(2) 被认为是相同的常数复杂度,Big-O 复杂度意味着与变量一起使用以捕获相对于变量的复杂度.

如果你想知道python是否用你的代码创建了一个新数组,你可以覆盖默认的列表对象来记录它的操作:

class ilist(list):
    def __init__(self, r=list()):
        print("Making new list: " + str(r))
        list.__init__(self, r)

    def __del__(self):
        print("Deleting list")


x = 5
while (x > 0):
    arr = ilist()
    arr2 = []
    arr.append(1)
    arr2.append(2)
    x -= 1
print("Finished while")

输出:

Making new list: []
Making new list: []
Deleting list
Making new list: []
Deleting list
Making new list: []
Deleting list
Making new list: []
Deleting list
Finished while
Deleting list

正如你所看到的,它确实每次都会创建和删除数组,因为该数组仅在 while 块内创建和使用。 但它的行为应该如此,如果您的意图是创建一次,那么您应该在外部范围内声明它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    相关资源
    最近更新 更多