1. 程式人生 > >算法復雜度

算法復雜度

執行時間 .... 增長 函數 進行 循環 alt 重復 技術分享

算法復雜度分為時間復雜度空間復雜度,一個好的算法應該具體執行時間短,所需空間少的特點。

隨著計算機硬件和軟件的提升,一個算法的執行時間是算不太精確的。只能依據統計方法對算法進行估算。我們拋開硬件和軟件的因素,算法的好壞直接影響程序的運行時間。 我們看一下小例子: int value = 0; // 執行了1次 for (int i = 0; i < n; i++) { // 執行了n次 value += i; } 這個算法執行了 1 + n 次,如果n無限大,我們可以把前邊的1忽略,也就是說這個算法執行了n次 時間復雜度常用大O符號表示,這個算法的時間復雜度就是O(n). 概念: 一般情況下,算法的基本操作重復執行的次數是模塊n的某一函數f(n),因此,算法的時間復雜度記做 T(n) = O(f(n))。 隨著模塊n的增大,算法執行的時間增長率f(n)的增長率成正比,所以f(n)越小,算法 的時間復雜度越低,算法的效率越高。 計算時間復雜度
1.去掉運行時間中的所有加法常數。 2.只保留最高階項。 3.如果最高階項存在且不是1,去掉與這個最高階相乘的常數得到時間復雜度 我們看一個例子 for (int i = 0; i < n; i++) { for (int j = i; j < n; j++) { // do ..... } } 當 i = 0 時 裏面的fo循環執行了n次,當i等待1時裏面的for循環執行了n - 1次,當i 等於2裏裏面的fro執行了n - 2次........所以執行的次數是 技術分享 技術分享
根據我們上邊的時間復雜度算法 1.去掉運行時間中的所有加法常數: 沒有加法常數不用考慮 2.只保留最高階項: 只保留 技術分享 3. 去掉與這個最高階相乘的常數: 去掉技術分享 只剩下 技術分享 最終這個算法的時間復雜度為技術分享 再看一個線性的 for ( int i = 0; i < n; i++) { // do ..... } 因為循環要執行n次所以時間復雜度為O(n) 其它的我也就不一個一個算了,下面給出了常用的時間復雜度

排序法

最差時間分析 平均時間復雜度 穩定度 空間復雜度
冒泡排序 O(n2
)
O(n2) 穩定 O(1)
快速排序 O(n2) O(n*log2n) 不穩定 O(log2n)~O(n)
選擇排序 O(n2) O(n2) 穩定 O(1)
二叉樹排序 O(n2) O(n*log2n) 不一頂 O(n)

插入排序

O(n2) O(n2) 穩定 O(1)
堆排序 O(n*log2n) O(n*log2n) 不穩定 O(1)
希爾排序 O O 不穩定 O(1)

算法復雜度