一些有關複雜度的問題
阿新 • • 發佈:2018-12-09
算出東西儘量記下來,不要重複計算啊!!
1.計算a^n f(a,n) 用遞迴的方法
package fads;
public class af {
public static int f(int a,int n)
{
if (n==0) return 1;
else
{
if((n&1)==0)//偶數 (n&1)==0 加括號
{int m=f(a,n/2);
return m*m; }
else
{int m=f(a,(n-1)/2);
return m*m*a;}
}
}
public static int f2(int a,int n)
{
if (n==0) return 1;
else
{
if((n&1)==0)//偶數 (n&1)==0 加括號
{
return f(a,n/2)*f(a,n/2); }
else
{
return f(a,(n-1)/2)*f(a,(n-1)/2)*a;}
}
}
public static void main(String[] args) {
for(int i=0; i<6;i++)
System.out.println(f(3,i));
}
}
我們注意f和f2的區別,
f由於用m記下值,所以複雜度Ο(log n)
f2沒有記下值,重複計算,複雜度Ο(n)
2^ n=2^ (n-1)+2^(n-1)
利用該式來計算2^n
下面是虛擬碼
第一種寫法,加法複雜度是Ο(2^n)
第二種,加法複雜度是Ο(n)
Algorithm Power(int n)
{
if n = 0 return 1;
else return Algorithm Power(n − 1) + Algorithm Power(n − 1);}
Algorithm Power2(int n)
{if n = 0 return 1;
else
{int m=Algorithm Power(n − 1);
return m+m;}
}