繁体   English   中英

如何计算该算法的时间复杂度

[英]How to calculate Time Complexity of this algorithm

我是渐近分析概念的新手。 我正在阅读 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)?

您在循环中迭代 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)(始终取最高功率)。

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) function 的实现,但它必须是这样的。

def sum(iterable):
    result=0

    for item in iterable: # worse time complexity: n
          result+=item
    return result

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

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

如果代码类似于以下:

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)

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

迭代(操作)

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

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

第三次迭代(对前 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 次操作。 *

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM