【问题标题】:Time complexity of a for or while loopfor 或 while 循环的时间复杂度
【发布时间】:2023-02-09 00:08:55
【问题描述】:

到目前为止,我所了解的以 n 作为输入的 for 循环的时间复杂度是 O(n),但是循环内的代码呢?

while var in arr:
    arr.remove(var)
    

arr 是一个包含 n 个元素的列表,var 可以是字符串或数字。

我怎么知道我应该增加还是增加时间复杂度?上面代码的时间复杂度是O(n**2)还是O(n)?

for i in range(n):
    arr.remove(var)
    arr.remove(var1)

现在的时间复杂度是多少?我应该加或乘什么?

我尝试学习时间复杂度,但无法理解如何处理具有不止一次复杂度的代码。

【问题讨论】:

  • 第二个代码将崩溃(除非 n=0)。这真的是您想询问的代码吗?
  • @KellyBundy 这只是两个操作的示例 sn-p。没有这样的代码
  • 使用一个明智的例子仍然会更好。

标签: python loops time-complexity


【解决方案1】:

您需要知道循环内内容的时间复杂度。

for i in arr:  # O(n) 
    print(sum(arr) - i)  # O(n)

在这种情况下,.pop(0) 嵌套在 forloop 中,因此您需要将复杂度乘以 forloop 复杂度:O(n) * O(n) > O(n*n) > O(n²)。

for i in arr:  # O(n) 
    print(sum(arr) - i)  # O(n)
    print(sum(arr) - i)  # O(n)

在这种情况下,它是

O(n) * (O(n) + O(n))
O(n) * O(n+n)
O(n) * O(2n)
O(n) * O(n)
O(n*n)
O(n²)

有关详细信息,请参阅When to add and when to multiply to find time complexity

对于 while 循环,它不会改变任何东西:将内容乘以 while 的复杂性。

【讨论】:

  • 嗯,你的代码 sn-ps 都不是他们的。
  • 严格来说,你不想繁衍。在这种情况下,结果是一样的,但你实际上是在总结一系列涉及 n 的每次收缩值的操作。 (sum(range(n)) == O(n**2))
  • @chepner 更准确地说:分别是sum(range(n/2), n)sum(range(n/3), n)
  • @chepner 对,没注意到,谢谢,我会更改示例。好点吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-08
  • 2016-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多