2.算法的时间和空间复杂性度量
算法的運行時間依賴于所用的計算機系統、編譯器、可用存儲空間大小,還依賴于所用的編程語言,系統提供的標準函數庫和動態鏈接庫等。
可以對算法的運行時間進行測量,以評估算法的時間和空間效率,但在不同的機型、編譯器版本、硬軟件配置的情況下,想通過測量結果來判斷算法執行效率的優劣是不可行的。
最好是通過比較算法的時間和空間復雜度來評價算法的優劣,因為時間和空間復雜度與具體運行環境和編譯器版本無關。
算法的復雜度度量與問題規模
一般來說,時間復雜度度量和空間復雜度度量都是問題規模的函數,因此在算法分析時有兩件事要做:
- 明確問題規模;
- 具體分析算法的程序代碼,再出算法具體服從何種函數。
為了簡化分析,僅涉及算法中可執行語句,及所需的附加存儲空間,時間復雜度與空間復雜度的單位都為1。
時間復雜度度量
為估算算法的時間復雜度看需要統計算法中所有語句中的執行頻度,即所有語句的執行次數。
計算如下:
算法的時間復雜度
=算法中所有運算語句的總執行時間
=算法中每條運算語句所執行時間的總和
=每條語句的執行次數×該語句執行時間
由于在計算機中基本運算語句,如加、減、乘、除、轉移、存取等的運算時間受計算機硬件、編譯器的編譯方法、操作系統的調度算法等的影響,很難準確估計,所以在度量時可視每條基本運算語句的執行時間為單位時間。
可以設定算法中每條運算語句的執行時間=該語句執行次數。
[程序 1-19] 計算矩陣各行元素的和
void example(float x[][m],int m){ //計算并輸出m行m列矩陣x各行元素的和float sum[m];int i,j;for(i=0;i<m;i++){sum[i]=0.0;for(j=0;j<m;j++)sum[i]=sum[i]+x[i][j];}for(i=0;i<m;i++)cout<<"Line"<<i<<":"<<sum[i]<<endl; }特別地,第一個for循環語句每次要執行兩條基本語句
i=0;i<m或i++;i<m;
提問:for(i=0;i<m;i++)語句為何執行了m+1次,而sum[i]=0.0;則執行了m次。
我的解答:從0開始到m有m+1個數,而當最后一次判斷i=m時不再將執行下一步循環,即i=m時只執行了for語句里的判斷,sum不再執行,而sum比for語句執行次數少一次。
[例 1-19] 對于程序1-20所示的遞歸算法,計算時間復雜度
[程序 1-20] 計算數組a前n個元素的值遞歸算法
float rsum(float a[],int n){if(n<=0)return 0;else return rsum(a,n-1)+a[n-1]; }在此遞歸算法中,語句if(n<=0)return 0是遞歸結束條件,要求執行n<0比較和執行return 0各一次,程序執行次數為2.
當n>0時進入遞歸rsum(a,n-1),計算n<=0比較一次,遞歸調用rsum(a,n-1)一次,加a[n-1]一次。
得到一個計算遞歸算法rsum(a,n)的程序執行次數的遞歸計算式Trsum(n):
這是一個遞推公式,通過重復代入Trsum來實現遞歸計算Trsum:
以上時間復雜度為一個重要例子,遞歸算法的時間復雜度計算
空間復雜度度量
算法的空間復雜度度量指算法所需附加存儲空間有多少:
如果空間大小僅與問題規模n有關,可以通過分析算法,找出所需空間大小與n的一個函數關系,就能得到所需空間大小。
[例 1-20] 程序1-21和程序1-22是計算n!的非遞歸算法和計算n!的遞歸算法,分別估算它們的空間復雜度。
[程序 1-21] 計算函數n!的非遞歸算法
int Fact(int n){ //假定n!不會超過所能表示的最大整數int product=1; //初始值為0!=1for(int i=1;i<=0;i++)product=i*product; }[程序 1-22] 計算n!的遞歸算法
int Fact(int n){if(n<=0)return 1;else return n*Fact(n-1); }在非遞歸實現的程序中1-21,問題規模為n。程序中用到一個整數product存放連乘結果,附加空間數為1,空間復雜度也為1。
在遞歸實現的程序1-22中,問題規模也是n。為了實現遞歸過程,用到了一種遞歸工作棧,沒遞歸一層就要加一個工作記錄到遞歸工作棧中,工作記錄為形式參數n,函數的返回值以及返回地址,保留了3個存儲單元。由于算法的遞歸深度為n,鼓所需的棧空間是3n,空間復雜度為3n。
最不好估計的是動態存儲分配所涉及的存儲空間。若使用了k次new命令,動態分配了k次空間單位。如果沒有使用delete命令釋放已分配的空間,那么占用的存儲空間數等于分配的空間數;如果使用了k次delete命令,就必須具體分析,
若用n代表new,用d代表delete,一個算法在運行過程中執行new和delete的順序為n,n,d,n,n,d,d,d,n,n,n,n,n,n分析這個序列就可以計算出空間復雜度為6。
總結
以上是生活随笔為你收集整理的2.算法的时间和空间复杂性度量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大疆无人机DJI Mobile SDK入
- 下一篇: 小型故障FCPX转场:YCImaging