Python 回溯算法的时间复杂度澄清

Python 回溯算法的时间复杂度澄清,python,algorithm,backtracking,Python,Algorithm,Backtracking,我编写了以下算法来解决一个经典的回溯问题:编写一个程序,它接受一个由n个整数组成的数组,其中a[I]表示可以从索引I前进的最大值,并返回是否可以从数组开始前进到最后一个索引 换句话说,A中的第i个条目是我们可以从i前进的最大值 比如说,, 如果A=[3,3,1,0,2,0,1],则可以到达最后一个索引。 如果A=[3,2,0,0,2,0,1],那么它不能 我编写了以下代码: from collections import defaultdict def array_advance(lst):

我编写了以下算法来解决一个经典的回溯问题:编写一个程序,它接受一个由n个整数组成的数组,其中a[I]表示可以从索引I前进的最大值,并返回是否可以从数组开始前进到最后一个索引

换句话说,A中的第i个条目是我们可以从i前进的最大值

比如说,, 如果A=[3,3,1,0,2,0,1],则可以到达最后一个索引。 如果A=[3,2,0,0,2,0,1],那么它不能

我编写了以下代码:

from collections import defaultdict 
def array_advance(lst):
  dict = defaultdict(lambda: 0)
  return advance(0, lst, dict)

def advance(start_idx, lst, memo):
  if start_idx >= len(lst): return False 
  if start_idx == len(lst) -1: return True 
  step_size = lst[start_idx]
  for i in range(1, step_size + 1):
    memo[step_size] |= advance(start_idx + step_size, lst, memo)
    if memo[step_size]:
      return True 
  return False
通过这段代码,我知道只有N个函数调用。如果我们记忆,则访问每个索引并缓存函数(索引)输出


然而,我很难理解时间的复杂性。关于输入的大小,当然时间复杂度是以O(N)为尺度的。然而,输入的内容也很重要。如果每个元素都是,比如说,L,并且输入的大小是10L,则for循环将以O(L)进行缩放,运行L次(从范围(1,L+1)开始运行一次),导致O(L^2)。如果我在回答一个算法问题,或者甚至试图分析时间复杂度,说时间复杂度O(N),因为时间复杂度随着数组长度的增加而增加,这似乎有误导性,因为它没有考虑输入的重要性。

假设步长从未超出数组,你可以说它是
O(和(A))
,因为考虑到数组元素,这是一个严格的界限。你也可以说它是
O(N^2)
,因为那是最坏的情况

通过向后迭代数组,记录迄今为止找到的最小索引,可以在O(N)时间和O(1)空间中解决问题,从而可以到达最后

def array_advance(a):
    i = len(a) - 1
    for j in range(i, -1, -1):
        if j + a[j] >= i: i = j
    return i == 0