使用 Big (O) 进行时间复杂度分析
Time Complexity Analysis Using Big (O)
arr = [1, 2, 5, 6, 7]
total = 0
for i in range(len(arr)):
total += sum(arr[i:])
上面代码的时间复杂度是O(n^2)还是O(n^3),list的切片造成的混淆arr。那么切片 arr 是如何影响时间复杂度的呢?
Slicing a list is O(k)
with k
being the size of the slice, which in this case rounds up to O(n)
。但是,在这种情况下,时间复杂度仍然是 O(n^2)
,因为 arr[i:]
是与 sum()
相加的,而不是相乘的。如果我们将其分解为两个单独的步骤,我们可以看到这一点:
for i in range(len(arr)): # executes n times
things_to_sum_over = arr[i:] # runs in (k -> n) time
total += sum(things_to_sum_over) # operates over (k -> n) elements
总计 n * 2(k -> n)
,或 2n^2
= O(n^2)
。
arr = [1, 2, 5, 6, 7]
total = 0
for i in range(len(arr)):
total += sum(arr[i:])
上面代码的时间复杂度是O(n^2)还是O(n^3),list的切片造成的混淆arr。那么切片 arr 是如何影响时间复杂度的呢?
Slicing a list is O(k)
with k
being the size of the slice, which in this case rounds up to O(n)
。但是,在这种情况下,时间复杂度仍然是 O(n^2)
,因为 arr[i:]
是与 sum()
相加的,而不是相乘的。如果我们将其分解为两个单独的步骤,我们可以看到这一点:
for i in range(len(arr)): # executes n times
things_to_sum_over = arr[i:] # runs in (k -> n) time
total += sum(things_to_sum_over) # operates over (k -> n) elements
总计 n * 2(k -> n)
,或 2n^2
= O(n^2)
。