資料結構與演算法 複雜度(上)

2021-09-11 11:28:33 字數 2738 閱讀 6061

資料結構

是計算機儲存、組織資料的方式。

演算法是指解題方****而完整的描述,是一系列解決問題的清晰指令,演算法代表著用系統的方法描述解決問題的策略機制。也就是說,能夠對一定規範的輸入,在有限時間內獲得所要求的輸出。

程式設計師學習資料結構和演算法,就是學習操縱資料結構解決問題的方法,就是學習如何更快速度更省空間的解決問題,即學習如何讓**跑的更快,如何讓計算機更省儲存空間。

什麼是時間複雜度和空間複雜度?

時間複雜度表示**執行時間隨資料規模增長的變化趨勢。

空間複雜度表示**執行空間隨資料規模增長的變化趨勢。

比如這段**:

int cal(int n) 

}return sum;

}

從 cpu 的角度來看,這段**的每一行都執行著類似的操作:讀資料-運算-寫資料。

所以每一行**的執行時間可以看做乙個單位時間,上面**的總執行時間t(n)=2n²+n+2個單位時間

我們常常看到的t(n)=o(f(n))就是大o時間複雜度表示法

其中,t(n) 表示**執行的時間;n 表示資料規模的大小;f(n) 表示每行**執行的次數總和。因為這是乙個函式,所以用 f(n) 來表示。公式中的 o,表示**的執行時間 t(n) 與 f(n) 表示式成正比。

時間複雜度的分析方法

1.以**中執行次數最多的為主

比如這段**:

int cal(int n) 

return sum;

}

執行時間t(n)=2n+3個單位時間,用大o表示法就是o(n)。

再比如這段**:

int cal(int n) 

}return sum;

}

執行時間t(n)=2n²+n+2個單位時間

用大o表示法就是o(n²)

凡是低階、常量和係數都略去

值得注意的是,不管迴圈多少次,只要是常量,哪怕是上萬次,用大o時間複雜度表示法,也應該把這個迴圈執行的次數略去。

這裡說明

o(n)

不一定比

o(n²)

執行時間短,只能說明隨著

n的擴大,

o(n²)

增長複雜度越來越高,具體到某一段**而言,要具體分析。

2.巢狀**的時間複雜度是內外複雜度的乘積

比如這段**:

int cal(int n) 

} int f(int n)

return sum;

}

時間複雜度應該是o(n²)

時間複雜度的分類

時間複雜度分為非多項式量級和多項式量級,np問題(non-deterministic polynomial, 非確定多項式)

非多項式量級只有兩種:

當資料規模 n 越來越大時,非多項式量級演算法的執行時間會急劇增加,求解問題的執行時間會無限增長。所以,非多項式時間複雜度的演算法其實是非常低效的演算法。

常見的多項式時間複雜度

1.常量階o(1)

比如

int i = 8;

int j = 6;

int sum = i + j;

2.線性階o(n)

int cal(int n) 

return sum;

}

3.平方階o(n²)

平方階就是二重迴圈 

int cal(int n) }}

4.對數階o(logn)

i=1;

while (i <= n) 

時間複雜度為實際上,不管是以 2 為底、以 3 為底,還是以 10 為底,我們可以把所有對數階的時間複雜度都記為 o(logn)。

因為對數之間是可以互相轉換的,

空間複雜度

例子**

private void print(int n) 

}

跟時間複雜度分析一樣,我們可以看到,第 2 行**中,我們申請了乙個空間儲存變數 i,但是它是常量階的,跟資料規模 n 沒有關係,所以我們可以忽略。第 3 行申請了乙個大小為 n 的 int 型別陣列,除此之外,剩下的**都沒有占用更多的空間,所以整段**的空間複雜度就是 o(n)。

我們常見的空間複雜度就是 o(1)、o(n)、o(

我們以0,1,1,2,3,5,8,13...這樣的數列(fibonacci數列)為例,求第n個數是多少?

遞迴法:

private int fib(int index)

if(index == 1)

return getnum(index-1)+getnum(index-2);

}

雖然**很短,但是空間複雜度卻是o(n)。

迴圈法:

int fib(int n)

while (n>2)

return c;

}

**雖然比遞迴法多不少行,但是其空間複雜度為o(1)。

由此可見,學習資料結構與演算法能鍛鍊我們的邏輯思維能力,提公升內功,在寫**時能夠看出**的時間和空間複雜度,寫出更快更省的**。

資料結構與演算法 時間複雜度與空間複雜度

解決乙個問題的方法可能有很多,但能稱得上演算法的,首先它必須能徹底解決這個問題 稱為準確性 且根據其編寫出的程式在任何情況下都不能崩潰 稱為健壯性 程式和演算法是完全不同的概念。演算法是解決某個問題的想法 思路 而程式是在根據演算法編寫出來的真正可以執行的 例如,要依次輸出一維陣列中的資料元素的值,...

資料結構 演算法複雜度

二 演算法的效能評價 三 真題解析 資料結構的第一章 緒論 包含的最後乙個重要內容是關於演算法的複雜度。這個考點一般會單獨出現在選擇題的前兩道,需要你熟練掌握演算法的基本概念 演算法時間複雜度和空間複雜度的分析判斷等。其次,還會出現在大題的程式設計部分,將演算法複雜度作為乙個限制條件,要求你給出滿足...

資料結構與演算法 複雜度分析

一 什麼是複雜度分析?1.資料結構和演算法解決是 如何讓計算機更快時間 更省空間的解決問題 2.因此需從執行時間和占用空間兩個維度來評估資料結構和演算法的效能。3.分別用時間複雜度和空間複雜度兩個概念來描述效能問題,二者統稱為複雜度。4.複雜度描述的是演算法執行時間 或占用空間 與資料規模的增長關係...