日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

2.算法的时间和空间复杂性度量

發(fā)布時(shí)間:2023/12/31 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2.算法的时间和空间复杂性度量 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

算法的運(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ī)模

  • 算法的時(shí)間復(fù)雜度是指當(dāng)問題的規(guī)模從1增加到n時(shí),解決這個(gè)問題的算法在執(zhí)行時(shí)所耗費(fèi)的時(shí)間也由1增加到T(n),則稱此為算法的時(shí)間復(fù)雜度為T(n)。
  • 算法的空間復(fù)雜度是指當(dāng)問題的規(guī)模從1增加到n時(shí),解決這個(gè)問題的算法在執(zhí)行時(shí)所占用的存儲(chǔ)空間也由1增加到S(n),則稱此算法的空間復(fù)雜度為S(n)。
  • 一般來(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ǔ)空間有多少:

  • 固定部分:這部分空間主要包括算法所需工作單元所占用的空間,這部分屬于靜態(tài)空間,只要做簡(jiǎn)單的統(tǒng)計(jì)就可估算;
  • 可變部分:這部分空間主要包括其與問題規(guī)模有關(guān)的數(shù)組所占空間,遞歸工作棧所用空間,以及在算法運(yùn)行過程中用過malloc(或new)和free(或delete)使用的空間。
  • 如果空間大小僅與問題規(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。