複雜度分析之大O表示法。

2021-09-27 04:26:24 字數 1842 閱讀 1839

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表示法是演算法的一種特殊的表示法,指出了演算法的速度有多快,它指出了演算法執行時間的...