使用T(n)方法计算时间复杂度?

时间:2020-07-24 09:46:38

标签: c algorithm time-complexity

如何使用f()方法计算T(n)的时间复杂度?

int f (int n)
{
    if (n==1)
        return 1;
    return f(f(n-1));
}

到目前为止我做了什么?

T(n)=T(T(n-1))=T(T(T(n-2)))=T(T(T(T(n-3))))...

另外,我知道对于每个n> = 1,该函数始终返回1

为什么将最后一行从以下位置更改:

return f(f(n-1));

收件人:

return 1+f(f(n-1));

是否会更改时间复杂度(注意:确定会将复杂度从n更改为2 ^ n )?

3 个答案:

答案 0 :(得分:1)

时间复杂度发生变化,因为函数并非总是RecyclerView.Adapterreturn 1;

对于+1,第二个return T(T(n-1));呼叫将始终使用T进行呼叫,这只会再增加1个呼叫。呼叫次数为1,因此复杂度为O(n)。

对于2*n-1,并非所有对return 1 + T(T(n-1));的呼叫都将导致T1将导致T(3)3的呼叫。因此,第二个调用取决于7的值。递增n将导致通话增加一倍。呼叫数为n,因此复杂度为O(2 ^ n)。在这里您可以看到通话数量:https://ideone.com/1KEAkU

第一个版本(T总是返回1):

2^n - 1

您会看到,左侧调用(外部调用)将始终以 T(4) T(1) T(3) T(1) T(2) T(1) T(1) 调用,并且树不会在那里继续。

第二个版本(T并不总是返回1):

1

在这里您可以看到,由于返回值 T(4) T(3) T(3) T(2) T(2) T(2) T(2) T(1) T(1) T(1) T(1) T(1) T(1) T(1) T(1) 的更改,第二个T(n) == n通话次数增加了一倍。

因为递归深度不变,所以空间复杂度不会增加,两个T图都有4条线,对于第二棵树,左侧部分只能在右侧部分完全完成后才能执行。例如对于两个T(4),运行的T(4)个函数的最大数量为T

答案 1 :(得分:0)

向程序添加任何常量C不会改变复杂性。通常,即使添加了5个不包含变量n的新语句,也不会改变复杂度。对于此程序, complexity = n ,因为您知道它最多可以运行n次。

答案 2 :(得分:0)

时间复杂度的(正确)递归关系是:

T(n) = T(n-1) + T(f(n-1))

这是因为要计算f(n),首先要计算f(n-1)(成本T(n-1)),然后使用参数f(n-1)调用f(成本T(f(n -1)))。

当f(n)始终返回1时,这将导致T(n)= T(n-1)+1,从而解出T(n)= Theta(n)。

f的return语句更改为return 1 + f(f(n-1))时,则f(n)为n> = 1返回n(通过简单的归纳证明)。

则时间复杂度为T(n)= T(n-1)+ T(f(n-1))= T(n-1)+ T(n-1)= 2T(n-1) ,求解为T(n)= Theta(2 ^ n)。

(作为一个有趣的注解,如果在第二种情况下(将+1)将if(n==1)return 1;更改为if(n==1)return 0;),则时间复杂度为Theta(Fib(n)),其中Fib (n)是第n个斐波那契数。