1. 程式人生 > >演算法的時間空間複雜度和空間複雜度總結

演算法的時間空間複雜度和空間複雜度總結

演算法的時間空間複雜度和空間複雜度總結

時間頻度

一個演算法中的語句執行次數稱為語句頻度或時間頻度。記為T(n)。

如何獲得T(n):

    public static int factorial(int n){
        int result = 1;     //①
        if(n == 0 || n == 1){   //②
            return result;  //③
        }else{
            for(int i = 2;i<=n;i++){    //④
                result *= i;    //⑤
            }
            return result;  //6
        }
    }

上面的這個方法中,①語句執行一次;②雖然是if語句,但判斷也需要執行一次;我們通常在計算演算法效率時,做最壞打算,因此我們認為if不成立,執行else中的語句,④語句中包含三條語句,各執行了n-1次;⑤語句處於for迴圈中,執行了n-1次;⑥語句執行一次。因此,T(n)=1+1+4(n-1)+1=n-1

時間複雜度

一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用T(n)表示,若有某個輔助函式f(n),使得當n趨近於無窮大時,T(n)/f(n)的極限值為不等於零的常數,則稱f(n)是T(n)的同數量級函式。記作T(n)=O(f(n)),稱O(f(n)) 為演算法的漸進時間複雜度,簡稱時間複雜度。

在上面已經提到了求T(n)的方法,現在我們只需要知道怎樣通過T(n)求出f(n),就得出時間複雜度O(f(n))

若把T(n)比作一棵樹,那f(n)就是將樹的枝葉修剪完的主幹,修剪的規則如下:

  • 常數省略,若T(n)本身就為常數,則f(n)=1
  • 低次階省略,例如T(n)=n^3+n^2+3,則f(n)=n^3
  • 係數忽略,例如T(n)=3n^3+n^2+3,則f(n)=n^3

為什麼會出現這樣的規則,這時是因為在演算法中,我們認為n趨於無窮大,因此常數、低次階、係數對於T(n)的影響很小,所以省略。

平均時間複雜度:平均時間複雜度是指所有可能的輸入例項均以等概率出現情況下該演算法的執行時間

最壞時間複雜度:最壞情況下的時間複雜度稱為最壞時間複雜度。一般討論的時間複雜度均是最壞時間複雜度。這樣做的原因是:最壞情況下的時間複雜度是演算法在任何輸入例項上執行時間的界限,這就保證了演算法的執行時間不會比最壞情況更長

常見的時間複雜度

常見的時間複雜度有:常數階O(1)、對數階O(log2n)、線性階O(n)、平方階O(n^2)、立方階O(n^3)、k次方階O(n^k)、線性對數階O(nlog2n)、指數階O(2^n)、階乘階O(n!)

時間複雜度由小到大依次為:O(1)<O(log2n)<O(n)<O(n^2)<O(n^3)<O(n^k)<O(nlog2n)<O(2^n)<O(n!)

用圖片表示部分時間複雜度隨n的增長T(n)增長的曲線:

曲線

1.O(1)

    a = 1;
    b = a;

T(n)為一個常數,因此f(n)=1,故O(f(n))=O(1)

2.O(log2n)

    i = 1;
    while(i<n){
        i *= 2;
    }

設while迴圈執行次數為x,則2^x=n,x=log2n,因此T(n)=2log2n+1,f(n)=log2n,故O(f(n))=O(log2n)

3.O(n)

    int a = 1;
    for(int i = 0;i < n;i++){
        a++;
    }

for迴圈執行次數為n次,因此T(n)=4n+1,f(n)=n,故O(f(n))=O(n)。一個n次迴圈的for迴圈就是線性階,兩個n次迴圈的for迴圈就是平方階,O(n^k)就是k個n次迴圈的for迴圈巢狀

4.O(nlog2n)

    int i = 1;
    int a = 1;
    while(i<n){
        for(int i = 0;i < n;i++){
            a++;
        }
        i *= 2;
    }

T(n)=2+2log2n+4nlog2n,f(n)=nlog2n,故O(f(n))=O(nlog2n)

呼叫方法時的時間複雜度的計算

呼叫方法時不參與迴圈,則可以將被呼叫方法的f(n)當做其T(n)加入到當前方法的T(n)中,已知factorial方法的時間複雜度為O(n)

    public static void print(int n){
        int a = 0;
        for (int i = 0;i<n;i++){
           a = i;
        }
        System.out.println(factorial(i));
    }
    public static int factorial(int n){
        int result = 1;
        if(n == 0 || n == 1){
            return result;
        }else{
            for(int i = 2;i<=n;i++){
                result *= i;    //①
            }
        }
        return result;
    }

T(n)=1+4n+n,print的時間複雜度為O(n)

呼叫方法時參與迴圈,這種情況下就要考慮迴圈條件,修改上面的部分程式碼:

    public static void print(int n){
        for (int i = 0;i<n;i++){
           System.out.println(factorial(i)); 
        }
    }

設print方法的時間頻度為T(n),①被呼叫的次數為0+0+1+2+...+n=(n^2+n)/2,故T(n)=3n+(n^2+n)/2,f(n)=n^2,所以O(n^2)。

空間複雜度

一個演算法的空間複雜度S(n)定義為該演算法所耗費的儲存空間,它也是問題規模n的函式。漸近空間複雜度也常常簡稱為空間複雜度。

一個演算法在計算機儲存器上所佔用的儲存空間,包括①儲存演算法本身所佔用的儲存空間,②演算法的輸入輸出資料所佔用的儲存空間,③演算法在執行過程中臨時佔用的儲存空間。

  • 儲存演算法本身所佔用的儲存空間由演算法程式碼的書寫長短有關,優化程式碼量可節約空間
  • 演算法的輸入輸出資料所佔用空間,通常解決一個問題的不同演算法的輸入輸出資料基本相同,因此不用考慮優化
  • 演算法在執行過程中臨時佔用的儲存空間,例如有些演算法通過陣列解決,有些通過連結串列解決等,不用的算法佔用的臨時儲存空間不同,需要關注優化。

演算法的空間複雜度也用O表示,指的是該演算法所佔用的空間隨問題規模n的增長所變化的情況,O(1)表示演算法所佔用空間不隨n的增長而增長;O(n)表示演算法所佔用空間隨n的增長線性增長

在衡量一個演算法的效率時,主要考慮時間複雜度,因為時間複雜度直接與使用者體驗相關,用空間換取時間也是可行的。

常用演算法的時間和空間複雜度

常用演算法的時間   
 
 </div> 
 <div class=

相關推薦

資料結構(排序演算法查詢演算法時間複雜空間複雜

這是從大神給多的網站上找到的演算法的時間複雜度趨勢和各個常用結構的複雜度截圖。     演算法的時間複雜度,用來度量演算法的執行時間,記作: T(n) = O(f(n))。它表示隨著 輸入大小n 的增大,演算法執行需要的時間的增長速度可以用 f(n) 來描

常用排序演算法時間複雜空間複雜及特點

一、常用排序演算法的時間複雜度和空間複雜度表格 二、特點 1.歸併排序: (1)n大時好,歸併比較佔用記憶體,記憶體隨n的增大而增大,但卻是效率高且穩定的排序演算法。 (2)歸併排序每次遞迴都要用到一個輔助表,長度與待排序的表長度相同,雖然遞迴次數是O(log2n),但每次

演算法時間複雜空間複雜計算

一、演算法的時間複雜度定義     在進行演算法分析時,語句總的執行次數T(n)是關於問題規模n的函式,進而分析T(n)隨n的變化情況並確定T(n)的數量級。演算法的時間複雜度,也就是演算法的時間量度。記作:T(n)=O(f(

【資料結構演算法】3~5 時間複雜空間複雜

演算法效率的度量方法 容易想到的方法是:把演算法跑若干次,然後拿個計時器在旁邊計時。這種方法被稱為“事後諸葛亮”方法,也稱為事後分析估算方法。 事前分析估算方法:在計算機程式比編寫前,依據統計方法對演算法進行估算。 通過總結,我們發現,一個高階語言編寫程式在計算機上執行所消耗的時間取決於

演算法分析(時間複雜空間複雜

演算法分析(時間複雜度和空間複雜度) 對於一個給定的演算法需要做兩項分析,第一就是證明演算法的正確性,第二就是計算演算法的複雜度。演算法的複雜度包括時間複雜度和空間複雜度。 1  度量演算法效率的方法 共存在兩種方法:事後統計法和事前分析估計演算法。 事後統計法:先將演算法實現,然

常用排序演算法中的時間複雜空間複雜

排序法 最差時間分析 平均時間複雜度 穩定度 空間複雜度 氣泡排序 O(n2) O(n2) 穩定 O(1) 快速排序 O(n2) O(n*log2n) 不穩定 O(log2n)~O(n) 選擇排序 O(n2) O(n2) 不穩定

第一章作業2-演算法時間複雜空間複雜

1-1 演算法分析的兩個主要方面是時間複雜度和空間複雜度的分析。 (1分) T      1-2 N​^2​​logN和NlogN^​2​​具有相同的增長速度。 (2分) F: N​^2​​logN較快 ,取對數對增長影響還是蠻大的,畢竟裸的logn函式後期增長

演算法時間複雜空間複雜-總結(轉)

演算法的時間複雜度和空間複雜度-總結         通常,對於一個給定的演算法,我們要做 兩項分析。第一是從數學上證明演算法的正確性,這一步主要用到形式化證明的方法及相關推理模式,如迴圈不變式、數學歸納法等。而在證明演算法是正確的基礎上,第二部就是分析演算法的

「 資料結構與演算法 1 」| 循序漸進理解時間複雜空間複雜

寫在之前 我們都知道,對於同一個問題來說,可以有多種解決問題的演算法。儘管演算法不是唯一的,但是對於問題本身來說相對好的演算法還是存在的,這裡可能有人會問區分好壞的標準是什麼?這個要從「時效」和「儲存」兩方面來看。 人總是貪婪的,在做一件事的時候,我們總是期望著可以付出最少的時間、精

問題:求n以內的所有素數。要求給出自然語言描述的演算法,並且實現演算法。事先分析演算法時間複雜空間複雜。/*如果錯誤或相關改進的歡迎提出,謝謝!*/

/*2018.10.20上傳,該貼還有部分需要完善,比如2輸不出,還有許多可以優化的地方,未完,待更~~*/ #include <stdio.h> #include <math.h> #include <time.h> void pr

排序演算法之 插入排序、希爾(shell)排序 及其時間複雜空間複雜

        有一個已經有序的資料序列,要求在這個已經排好的資料序列中插入一個數,但要求插入後此資料序列仍然有序,這個時候就要用到一種新的排序方法——插入排序插入排序的基本操作就是將一個數據插入到已經排好序的有序資料中,從而得到一個新的、個數加一的有序資料,演算法適用於少

資料結構演算法(4)-----演算法時間複雜空間複雜

1.演算法的時間複雜度定義  在進行演算法分析時,語句總的執行次數T(n)是關於問題規模n的函式,進而分析T(n)隨n的變化情況並確定T(n)的數量級。演算法的時間複雜度,也就是演算法的時間量度。記作:T(n)=O(f(n))。它表示隨問題n的增大,演算法執行時間的增長率和f(n)的增

常見排序演算法及對應的時間複雜空間複雜

轉載請註明出處: 排序演算法經過了很長時間的演變,產生了很多種不同的方法。對於初學者來說,對它們進行整理便於理解記憶顯得很重要。每種演算法都有它特定的使用場合,很難通用。因此,我們很有必要對所有常見的排序演算法進行歸納。 排序大的分類可以分為兩種:內

演算法穩定排序非穩定排序、內排序外排序、時間複雜空間複雜

轉自:點選開啟連結 1、穩定排序和非穩定排序 簡單地說就是所有相等的數經過某種排序方法後,仍能保持它們在排序之前的相對次序,我們就說這種排序方法是穩定的。反之,就是非穩定的。 比如:一組數排序前是a1,a2,a3,a4,a5,其中a2=a4,經過某種排序後為a1,a2,a4

演算法複雜——演算法時間複雜空間複雜

空間複雜度(Space Complexity)是對一個演算法在執行過程中臨時佔用儲存空間大小的量度。一個演算法在計算機儲存器上所佔用的儲存空間,包括儲存演算法本身所佔用的儲存空間,演算法的輸入輸出資料所佔用的儲存空間和演算法在執行過程中臨時佔用的儲存空間這三個方面。演算法的輸入輸出資料所佔用的儲存空間是由要解

排序演算法之 歸併排序 及其時間複雜空間複雜

        在排序演算法中快速排序的效率是非常高的,但是還有種排序演算法的效率可以與之媲美,那就是歸併排序;歸併排序和快速排序有那麼點異曲同工之妙,快速排序:是先把陣列粗略的排序成兩個子陣列,然後遞迴再粗略分兩個子陣列,直到子數組裡面只有一個元素,那麼就自然排好序了,可

排序演算法之 基數排序 及其時間複雜空間複雜

        基數排序(radix sort)屬於“分配式排序”(distribution sort),又稱“桶子法”(bucket sort)或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些“桶”中,藉以達到排序的作用,基數排序法是屬於穩定

演算法複雜的分析——時間複雜空間複雜

演算法的複雜度 如何分析一個演算法的複雜度? 演算法的時間複雜度和空間複雜度統稱為演算法的複雜度 時間複雜度: 下面程式碼的迴圈語句總共會執行多少次? void Test(int n) { int iConut = 0; for(int i = 0; i <

演算法複雜——時間複雜空間複雜

1、時間複雜度   (1)時間頻度 一個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且一個演算法花費的時間與演算法中語句的執行次數成

排序演算法時間複雜空間複雜-----總結

演算法的時間複雜度是指:演算法執行過程中所需要的基本運算次數。 常見的演算法時間複雜度由小到大依次為:Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n^2)<Ο(n^3)<…<Ο(2^n)<Ο(n!)。其中O(1)表示基本語句的執行次數是一個常數,一般來說,