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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

算法的運行時間依賴于所用的計算機系統、編譯器、可用存儲空間大小,還依賴于所用的編程語言,系統提供的標準函數庫和動態鏈接庫等。

可以對算法的運行時間進行測量,以評估算法的時間和空間效率,但在不同的機型、編譯器版本、硬軟件配置的情況下,想通過測量結果來判斷算法執行效率的優劣是不可行的。

最好是通過比較算法的時間和空間復雜度來評價算法的優劣,因為時間和空間復雜度與具體運行環境和編譯器版本無關。

算法的復雜度度量與問題規模

  • 算法的時間復雜度是指當問題的規模從1增加到n時,解決這個問題的算法在執行時所耗費的時間也由1增加到T(n),則稱此為算法的時間復雜度為T(n)。
  • 算法的空間復雜度是指當問題的規模從1增加到n時,解決這個問題的算法在執行時所占用的存儲空間也由1增加到S(n),則稱此算法的空間復雜度為S(n)。
  • 一般來說,時間復雜度度量和空間復雜度度量都是問題規模的函數,因此在算法分析時有兩件事要做:

    • 明確問題規模;
    • 具體分析算法的程序代碼,再出算法具體服從何種函數。

    為了簡化分析,僅涉及算法中可執行語句,及所需的附加存儲空間,時間復雜度與空間復雜度的單位都為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:

    以上時間復雜度為一個重要例子,遞歸算法的時間復雜度計算

    空間復雜度度量

    算法的空間復雜度度量指算法所需附加存儲空間有多少:

  • 固定部分:這部分空間主要包括算法所需工作單元所占用的空間,這部分屬于靜態空間,只要做簡單的統計就可估算;
  • 可變部分:這部分空間主要包括其與問題規模有關的數組所占空間,遞歸工作棧所用空間,以及在算法運行過程中用過malloc(或new)和free(或delete)使用的空間。
  • 如果空間大小僅與問題規模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.算法的时间和空间复杂性度量的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。