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步而不是迭代?我很难搞清楚。
答案 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 - 1
,i
和i + 1
。因此,复杂性等于O(3 * n) = O(n)
。