如何计算函数的最坏情况复杂度?

时间:2016-03-11 15:19:37

标签: python python-3.x complexity-theory

def functionX(L):
     """ L is a non-empty list of length len(L) = n. """
     i= 1
     while i< len(L) -1:
         j = i-1
         while j <= i+ 1:
             L[j] = L[j] + L[i]
             j = j + 1
         i= i+ 1

对于j循环,为什么我们有3个迭代,每个迭代3步而不是迭代?我很难搞清楚。

2 个答案:

答案 0 :(得分:2)

for循环比while循环更清晰吗?

def functionY(L):
    N = len(L)
    for i in range(1,N-1):
        for j in range(i-1,i+2):
            L[j] = L[j] + L[i]

伪代码怎么样?

for i in range(N): # drop the -1s on both ends; O(n-2) = O(n)
    for j in range(3): # (i-1) to (i+2) covers 3 elements
        do something

这很清楚Tony的回答是正确的,我们在O(n)类。具体而言,行L[j] = L[j] + L[i]将被访问3n-6次。这是复杂性类O(3n) = O(n)。如果您将数组访问视为原子操作,那么我们仍然有O(3*(3n-6)) = O(n)。如果行读取L[j] += L[i],复杂性类不会改变,尽管数组访问的总数会下降。

答案 1 :(得分:1)

你有外部循环的n次迭代,并且在每次外循环迭代中,内部循环的3次迭代,因为对于给定的i,变量j值为i - 1ii + 1。因此,复杂性等于O(3 * n) = O(n)