3.4.3遞歸算法的效率分析
longFact(long n) { long temp; if(n==0)return1;//活動記錄退棧 else temp=n*Fact(n-1);//活動記錄進棧 returntemp;//活動記錄退棧 }
設Fact(n)的執行時間是T(n)。此遞歸函數中語句4的時間復雜度為O(1)【因為語句4的執行次數不會隨著問題規模n的改變而改變】。遞歸調用Fact(n-1)的執行時間是T(n-1)【因為隨著n的不同,函數中Fact(long n)會被執行n次】,所以語句5的執行時間是O(1)+T(n-1)【因為語句5中最後一次傳進的參數是0,所以執行的是語句4。又前面共執行了n-1次調用,所以有執行時間是O(1)+T(n-1)】。 加入設兩數相乘和賦值的時間復雜度都是O(1),則對某常數C【非終止條件下的遞歸通式】、D【終止條件下的執行時間】有如下遞歸方程
1.時間復雜度的分析2、空間復雜度的分析1.時間復雜度的分析在算法分析中,當一個算法中包含遞歸調用時,其時間復雜度的分析可以轉化為一個遞歸方程求解。也就是數學上求漸進解得問題,而遞歸方唱的形式多種多樣,其求解方法也不盡相同。叠代法是求解遞歸方程的一種常用方法,其基本步驟是叠代地展開遞歸方程的右端,使之成為一個非遞歸的和式,然後通過對和式的估計(即方程的解)來達到對左端的估計。 下面以階乘為例求解時間復雜度。階乘執行函數如下:long Fact(long n){ long temp; if(n==0) return 1;//活動記錄退棧 else temp=n*Fact(n-1);//活動記錄進棧 return temp;//活動記錄退棧}
設Fact(n)的執行時間是T(n)。此遞歸函數中語句4的時間復雜度為O(1)【因為語句4的執行次數不會隨著問題規模n的改變而改變】。遞歸調用Fact(n-1)的執行時間是T(n-1)【因為隨著n的不同,函數中Fact(long n)會被執行n次】,所以語句5的執行時間是O(1)+T(n-1)【因為語句5中最後一次傳進的參數是0,所以執行的是語句4。又前面共執行了n-1次調用,所以有執行時間是O(1)+T(n-1)】。加入設兩數相乘和賦值的時間復雜度都是O(1),則對某常數C【非終止條件下的遞歸通式】、D【終止條件下的執行時間】有如下遞歸方程
設n>2,利用上式對T(n-1)展開,即在上式中用n-1代替n得到T(n-1)=C+T(n-2)再代入T(n)=C+T(n-1)中,有T(n)=2C+T(n-2)同理,n>3時有T(n)=3C+T(n-3)以此類推,當n>i時有T(n)=iC+T(n-i)最後,當i=n時有T(n)=nC+T(0)=nC+D求得遞歸方程的解為:T(n)=O(n)采用這種方法計算Fibonacci數列和Hanoi塔問題遞歸算法的時間復雜度為
2、空間復雜度的分析遞歸函數在執行時,系統會建立一個“遞歸工作棧”存儲每一層遞歸所需的信息,此工作棧是遞歸函數執行的輔助空間,因此,分析遞歸算法的空間復雜度需要分析工作棧的大小。對於遞歸算法,空間復雜度S(n)=O(f(n))其中,f(n)為“遞歸工作棧”中工作記錄的個數,與問題規模n的函數關系。根據這種分析方法不難得到,前面討論的階乘問題、Fibonacci數列問題、Hanoi塔問題的遞歸算法的空間復雜度為O(n)。
3.4.3遞歸算法的效率分析