【问题标题】:How to calculate Time Complexity of this algorithm如何计算该算法的时间复杂度
【发布时间】:2020-07-20 06:40:43
【问题描述】:

我是渐近分析概念的新手。我正在阅读 Goodrich 的“Python 中的数据结构和算法”。在那本书中,它的实现如下:

 def prefix average2(S):
 ”””Return list such that, for all j, A[j] equals average of S[0], ..., S[j].”””
 n = len(S)
 A = [0] n # create new list of n zeros
 for j in range(n):
      A[j] = sum(S[0:j+1]) / (j+1) # record the average
 return A

这本书说这段代码在 O(n^2) 中运行,但我不知道如何。 S[0:j+1] 在 O(j+1) 时间内运行,但我们如何知道“sum()”在什么时间运行以及如何让运行时间为 O(n^2)?

【问题讨论】:

  • sum(list) 对列表的 所有 个元素求和,因此对于 m 个元素来说是 O(m),因为您显然必须“访问”每个元素一次才能对它们求和起来。

标签: python algorithm performance big-o


【解决方案1】:

你在循环中迭代 n 次。在第一次迭代中,对 1 个数(1 个时间步)求和,然后对 2 个(2 个时间步)求和,以此类推,直到达到 n(本次迭代的 n 个时间步,您必须访问每个元素一次)。因此,您有 1+2+...+(n-1)+n=(n*(n+1))/2 个时间步。这等于 (n^2+n)/2,或消除常数后的 n^2+n。此项的阶数为 2,因此您的运行时间为 O(n^2)(始终取最大幂)。

【讨论】:

    【解决方案2】:
    for j in range(n): # This loop runs n times.
          A[j] = sum(S[0:j+1]) # now lets extend this sum function's implementation.
    

    我不确定 sum(iterable) 函数的实现,但它必须是这样的。

    def sum(iterable):
        result=0
    
        for item in iterable: # worse time complexity: n
              result+=item
        return result
    

    所以,最后,您的 prefix_average2 函数将在最坏的情况下运行 n*n=n^2 次(当 j+1=n 时)

    【讨论】:

      【解决方案3】:

      首先,我不是这方面的专家,但我想和大家分享一下我的看法。

      如果代码类似如下:

      for j in range(n):
          A[j] += 5 
      

      那么我们可以说复杂度是O(n)

      您可能会问为什么我们跳过了n=len(S)A=[0]

      因为这些变量需要 0(1) 时间来完成操作。

      如果我们退回我们的案子:

      for j in range(n):
          A[j] = sum(S[0:j+1]) ....
      

      这里,sum(S[0:j+1])还有一个循环求和计算。

      你可以这样想:

      for q in S:
          S[q] += q  # This is partially right
      

      重要的是在该代码中处理两个for循环计算。

      for j in range(n):
          for q in range(S)
              A[j] = ....
      

      因此复杂度为O(n^2)

      【讨论】:

        【解决方案4】:

        For 循环(for j in range(n))有 n 次迭代:

        迭代(操作)

        第一次迭代(对前 1 个元素求和的 1 次操作)

        第二次迭代(前 2 个元素相加的 2 次操作)

        第 3 次迭代(前 3 个元素求和的 3 次操作)

        .

        .

        .

        (n-1) 次迭代(n-1 次求和前 n-1 个元素的操作)

        第n次迭代(n次求和前n个元素的操作)

        所以,总运算次数是(1 + 2 + 3 +......(n-1) + n)...的总和......

        即 (n*(n+1))//2。

        所以时间复杂度是 O(n^2),因为我们必须进行 (n(n+1))//2 次操作。*

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-08-25
          • 2011-06-21
          • 1970-01-01
          • 1970-01-01
          • 2011-04-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多