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