本文是學習演算法的筆記,《資料結構與演算法之美》,極客時間的課程
資料結構和演算法 解決快與省的問題 即如何讓**執行的更快,如何讓**更省儲存空間
複雜度描述的是演算法執行時間(或占用空間)與資料規模的增長關係
事後統計法,也就是跑一遍**,就可以得到執行時間和占用記憶體大小。其侷限性在於:結果非常依賴測試環境,比如處理器不同,硬體不同,導致結果可能不一樣。還有一點是測試結果受資料規模的影響很大
大o複雜度表示法
所有**的執行時間,與每行**的執行次數成正比
t(n) = o(f(n))
常量、係數三部分並不左右增長趨勢,只需要記錄乙個最大級就可以了,
t (n) = o (n); t(n)= o(n^2)
時間複雜度分析
只關注迴圈次數最多的一段**
加法法則:總複雜度等於量級最大的那段**的複雜度
t(n) =o(max(f(n), g(n)))
乘法法則:巢狀**的複雜度等於巢狀內外**複雜度的乘積
t(n)=o(f(n)*g(n))
常用的複雜度級別?
多項式階:隨著資料規模的增長,演算法的執行時間和空間占用,按照多項式的比例增長。包括,
o(1)(常數階)、o(logn)(對數階)、o(n)(線性階)、o(nlogn)(線性對數階)、o(n2)(平方階)、o(n3)(立方階)
非多項式階:隨著資料規模的增長,演算法的執行時間和空間占用暴增,這類演算法效能極差。包括,
o(2^n)(指數階)、o(n!)(階乘階)
o(1): 一般情況下,只要演算法中下存在迴圈語句、遞迴語句,即使成千上萬行的**,其時間複雜度也是o(1)。
o(logn) o(nlogn)
對數階的複雜度很常見,但比較難分析。看下面的一段偽**
for(int i = 1; i < n; i++)[
i = i * 2;
}
i 的值是乙個等比數列,首項為1,公比為2,如果**執行的次數為x ,則2^x = n 可得出x = log2n。它的複雜度就是o(log2n) 根據對數的性質,log2n = logn * 常數,對於時間複雜度,常數可省略。得到此偽**的複雜度 o(logn) 複雜度分析 時間複雜度分析和空間複雜度分析
其實,只要講到資料結構與演算法,就一定離不開時間 空間複雜度分析。而且我個人認為,複雜度分析是整個演算法學習的精髓,只要掌握了它,資料結構和演算法的內容基本上就掌握了一半。1.時間複雜度分析 對於剛才羅列的複雜度量級,我們可以粗略地分為兩類,多項式量級和非多項式量級。其中,非多項式量級只有兩個 o ...
複雜度分析 時間複雜度 空間複雜度
執行效率是演算法的乙個重要的考量指標,演算法的執行效率用時間 空間複雜度來衡量。今天我們來學習一下複雜度的分析。通常我們可以通過執行程式來獲得演算法的真正的執行時間,這種方法我們可以稱為事後統計法,但這種方法得到的是具體的資料,測試結果很依賴測試環境,而且受資料規模影像最大。因此,我們需要乙個不需要...
複雜度分析(上)時間複雜度 空間複雜度
為了肉眼 實時 快速地來分析出 的複雜度,我們需要乙個不用具體的測試資料來測試,就可以粗略地估計演算法的執行效率的方法。時間複雜度 空間複雜度 表示演算法的執行時間與資料規模之間的增長關係。每行 對應的 cpu 執行的個數 執行的時間都不一樣,但是,我們這裡只是粗略估計,所以可以假設每行 執行的時間...