如何使用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 )?
答案 0 :(得分:1)
时间复杂度发生变化,因为函数并非总是RecyclerView.Adapter
来return 1;
。
对于+1
,第二个return T(T(n-1));
呼叫将始终使用T
进行呼叫,这只会再增加1个呼叫。呼叫次数为1
,因此复杂度为O(n)。
对于2*n-1
,并非所有对return 1 + T(T(n-1));
的呼叫都将导致T
,1
将导致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个斐波那契数。