递归查找Big O时间复杂度

时间:2016-10-11 17:22:13

标签: algorithm recursion time-complexity big-o

我正在学习时间的复杂性,并试图找出一种关系。我的讲义将递归查找函数描述为:

find(array A, item I)
  if(arrayEmpty(A)) return BAD;
  if(item == A[0]) return GOOD;
  return find(allButFirst(A), I);

有用的链接:https://www.youtube.com/watch?v=_cG5KZSn1LE

我的笔记说时间复杂性的起始关系如下:

T(n) = 1 + T(n-1) // I understand this
T(1) = 1 // only one computation, understandable

然后我们展开T(n)

T(N) = 1 + 1 + T(n-2) // every recursive step 1 comparison plus recursive call
T(N) = 1 + 1 + 1 + T(n-3) 
T(N) = 1 + 1 + 1 + 1 + T(n-4) 
...
T(N) = (n - 1) + T(n-(n-1)) // This point I am lost how they got this generalisation

如果有人可以解释上述关系如何推广到T(N)=(n - 1)+ T(n-(n-1)),并且为了清晰起见,可能会举一个例子。

例如,我想尝试使用某些值的上述关系,所以让我们说A {1,2,3}和I = 3

然后是以下计算

1 + T(n-1) // {2,3}
1 + 1 + T(n-2) // {3}
1 // {3} Found

所以对于上面我们总共有3个比较和2个递归调用。所以我想说这个关系是T(n)= n + t(n-(n-1))= n + t(1)= n。

1 个答案:

答案 0 :(得分:2)

在展开模式的每个步骤中,如果我们k步入递归(第一步k=1,最后一步,k=n),则k 1}} 1' s。

在您发布的扩展中,最后一行T(N) = (n - 1) + T(n-(n-1))是倒数第二步,因为T(n-(n-1))扩展为T(1),因此对于该行,{{1} }。

因此该行中有k=n-1 1个,因此n-1一词。

同样,在(n-1)步骤传递给T的参数是k减去当前步骤,因为它是剩余步数。对于第一行,即n,因此n-k = n-1。对于倒数第二步,它是T(n-1),因此n-k = n-(n-1)