空間複雜度
時間複雜度
第一段**:
1
intcal
(int n)
7return sum;
8}
如上所示**,求 1,2,3…n 的累加和,從cpu的角度看,這段**每一行都執行著類似的操作:讀資料-運算-寫資料。
我們假設每行**執行的時間是一樣的,為unit_time,在這個基礎上,我們可以估算出這段**的總的執行時間。
第2行和第3行都只執行一次,為2 * unit_time時間,第4行和第5行都執行了n遍,為
2n*unit_time時間,所以這段**總的執行時間 t(n) 大概為:
t(n) = (2n + 2)*unit_time;
從上面的計算公式可看出,**的總執行時間 t(n) 與每行**的執行次數 n 成正比。
在來看下面的**:
第二段**:
1
intcal
(int n)10}
11}
如上**所示,這是乙個迴圈巢狀**,同樣假定每行**執行時間都是一樣的為
unit_time,第2,3,4行每行都執行一次,時間為3 * unit_time,第5,6行執行了n次,
時間為2n*unit_time,第7,8行執行了n2次,時間為2n2 * unit_time,這段**總執行時間t(n)為:
t(n) = (2n*n + 2n + 3)*unit_time;
大o表示法
t(n) = o(f(n));
t(n) 表示**執行的時間;n 表示資料規模,f(n)表示每行**執行的時間總和,因為
是乙個公式,所以用f(n)表示,公式中的o代表 t(n) 與 f(n) 成正比。
大o表示法並不表示**執行的具體時間,而是表示**執行時間隨資料規模增長的變化趨勢。所有也叫漸近時間複雜度,簡稱時間複雜度。
因為大o表示法只表示時間趨勢,所以在估算時間時,會忽略公式中的常量,低階項。
如:t(n) = (2n + 2)*unit_time
只取n作為估算,大o表示時間複雜度為: o(n)
t(n) = (2n*n + 2n + 3)*unit_time
只取n2,大o表示時間複雜度為: o(n2)
空間複雜度
1
void
print
(int n)
7for
(i = n-
1; i >=0;
--i)
10}
複雜度分析 時間複雜度分析和空間複雜度分析
其實,只要講到資料結構與演算法,就一定離不開時間 空間複雜度分析。而且我個人認為,複雜度分析是整個演算法學習的精髓,只要掌握了它,資料結構和演算法的內容基本上就掌握了一半。1.時間複雜度分析 對於剛才羅列的複雜度量級,我們可以粗略地分為兩類,多項式量級和非多項式量級。其中,非多項式量級只有兩個 o ...
分析時間複雜度(1)
目錄 一 度量 1.1 定義 1.2 思路 二 實戰 2.1 例一 2.2 例二求n 的遞迴函式的時間複雜度 2.3 例三 將演算法中基本操作的執行次數作為演算法時間複雜度的度量。這裡所討論的時間複雜度不是執行完一段程式的總時間,而是其中基本操作的總次數。這很好理解 程式執行環境不同,執行的總時間是...
演算法複雜度分析 1
空間複雜度 複雜度分析是整個演算法學習的精髓,只要掌握了它,資料結構和演算法的內容基本上就掌握了一半。如果存在常數c和n0使得當n n0時t n cf n 則記為t n o f n 例如 雖然對於較小的n值1000n要比n2大,但n2以更快地速度增長,因此n2最終將是更大的函式。在這種情況下,n 1...