1、概要。
好的程式設計表現出程式執行速度快,占用記憶體空間小的優點,分別對應時間複雜度和空間複雜度。
2、複雜度分類兩種。
演算法的時間複雜度是指演算法需要消耗的時間資源。演算法執行時間的增長率與f(n) 的增長率正相關,稱作漸近時間複雜度(asymptotic time complexity),簡稱時間複雜度。定義為t(n) = o(f(n)),稱函式t(n)以f(n)為界或者稱t(n)受限於f(n)。
演算法的空間複雜度是指演算法需要消耗的空間資源。其計算和表示方法與時間複雜度類似,一般都用複雜度的漸近性來表示。
3、時間複雜度。
3.1辨識要素及示例。
int calcsum(int n)
return sum;
}
demo求累加和,假設每條語句執行時間為time,容易算出來該函式執行時間為:t(n) = time+time+ntime2 = 2*(n+1)*time。用f(n)來表示**的執行次數和資料規模的關係,即f(n)=2n+2。f(n)中的常數項對於整個公式的值的影響我們直接忽略,同樣,我們也忽略係數。即得:f(n) = n;代入t(n) = o(f(n)),得:t(n) = o(n),線性階。
①、只關注迴圈執行次數最多的一段**;
int calcsum(int n)
for (int j = 0; j < n * 2; j++)
return sum1 + sum2;
}
容易看出來迴圈二比迴圈一的執行次數多,因此只需要關注迴圈二,得到t(n) = o(n);線性階。
②、加法法則:總複雜度等於量級最大的那段**的複雜度;
int calcsum(int n)
for (int j = 0; j < n; j++)
for (int i = 0; i < n; i++) }
return sum1 + sum2 + sum3;
}
容易得到迴圈一二三的時間複雜度分別為:o(1) (常數階),o(n)(線性階),o(n^2)(平方階);則t(n) = o(1)+o(n)+o(n^2);按照加法原則,總複雜度等於量級最大的那段**的複雜度。即t(n) = o(n^2),平方階。
③、乘法法則:巢狀**的複雜度等於巢狀內外**複雜度的乘積。
int calcsum(int n)
} return sum;
}
巢狀迴圈 = 外層內層。即t(n) = o(nn) = o(n^2),平方階。
ps:對數階:
int calcsum(int n)
while (i < n);
return sum;
}
4、空間複雜度。
空間複雜度比較常用的有:o(1)、o(n)、o(n²)。
4.1 s(n) = o(1).
不存在儲存空間隨變數變化情況。
void getspace(int n)
}
4.2 s(n) = o(n).
例程中,申請空間後,沒有在申請其他空間。複雜度為:o(n)。
void getspace(int n)
}
5、 總結
①、演算法的速度並非指時間,不是以秒為單位;而是運算元的增速。從增量的角度度量的。
②、平時說演算法的速度,指的是隨著輸入的增加,其執行時間將會以什麼樣的速度進行增加。
③、演算法執行時間用大o表示法表示。
④、 o(㏒n)比o(n)快。當操作的元素規模差距越大,快的越明顯。
大O表示法 時間複雜度
引入原因 用另乙個 通常更簡單的 函式來描述乙個函式數量級的漸近上界。定義 如果乙個問題的規模是n,解這一問題的某一演算法所需要的時間為t n 它是n的某一函式。t n 稱為這一演算法的 時間複雜度 某個演算法的複雜度到達了這個問題複雜度的下界,那就稱這樣的演算法是最佳演算法 決定演算法複雜度的是執...
大O表示法和時間複雜度
學資料結構和演算法的目的 實現程式的高速執行,那麼必然要了解複雜度。複雜度分為兩個維度 時間 空間。在開發過程中,我們希望時間和記憶體消耗都越少越好,但很多時候無法做到兼顧,需要在時間和空間之間做出取捨已達到最佳狀態。對複雜度的計算一般採用事前分析估算的方法,即大o表示法。接下來讓我們進入複雜度的學...
演算法表示法之大O表示法
我們在描述演算法複雜度時,常用o 1 o n o logn o n logn 等表示對應演算法的時間複雜度,是演算法的時空複雜度的表示。不僅僅用於表示時間複雜度,也用於表示空間複雜度。這種表示法稱之為大o表示法 大o表示法是演算法的一種特殊的表示法,指出了演算法的速度有多快,它指出了演算法執行時間的...