使用 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)