【问题标题】:What is the time-complexity of this for-loop?这个 for 循环的时间复杂度是多少?
【发布时间】:2021-02-12 21:41:34
【问题描述】:
for i in range(n - length + 1):
     minimumvalue = min(diskSpace[i:i + length])
     minimumList.insert(len(minimumList), minimumValue)

return(max(minimumArray)

因此,对于范围内的 i 需要 O(n) 时间,python min 函数是 O(n) 时间,而 insert 是 0(n) 时间。由于这些在我的 for 循环中,我的总时间复杂度是 O(n^2) 还是 O(n)?

【问题讨论】:

  • ....这里的输入是什么? length 是变量吗?是否依赖n
  • 顺便说一句,不要使用minimumList.insert(len(minimumList), minimumValue) 使用minimumList.append(minimumValue)
  • "并且插入时间为 0(n)。"不是,如果你在最后插入,即.appending... 那是(摊销的)恒定时间
  • @juanpa.arrivillaga 你好,这是一个滑动窗口问题,length是窗口的segment长度,n是列表的总长度。所以 n - length + 1 会给你所有可能的滑动窗口。例如,diskSpace = [1,2,3] 然后 n = 3,我们可以让 length = 2。那么滑动窗口的数量将是 2,例如 [1,2] 和 [2,3]。我只是用 min 找到最小值并插入另一个数组。然后我找到那个最小列表的最大值。所以 max(1,2) 在我们的例子中是 2。我认为总复杂度是 O(n*length)?

标签: python list for-loop time complexity-theory


【解决方案1】:

这是 O(n),因为您对 min()insert() 函数的复杂性有误。

min() 通常为 O(n),但您总是使用相同的 length 元素调用它。除非length 依赖于n,否则可以将其视为常数时间。

insert() 通常也是 O(n),但是您通过指定位置 len(minimumList) 在末尾插入,所以这是摊销的常数时间。其实在那个位置插入就相当于minimumList.append(minimumValue),也就是摊销的常数时间。

代码中唯一依赖n的部分是for i in range(n - length + 1):的迭代次数

如果length 是复杂度的输入,则总复杂度为 O(n*length)。

【讨论】:

    【解决方案2】:

    min 函数是 O(n),因为它是每个元素的恒定操作量(n * 某个常数)。您的 for 循环对每个元素 (n * (some constant * n)) 执行此操作。

    所以这将是 n * n(我们可以省略常数,因为这对于查看此函数的扩展程度并不重要),因此您的运行时间为 O(n^2)。

    【讨论】:

    • 但尚不清楚min 是否受到n 的影响。如果length 不依赖于n,则min(diskSpace[i:i + length]) 相对于N 可能是常数。所以考虑一下,for _ in range(n): min(range(100))线性时间
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多