演算法時間複雜度

2021-08-10 10:11:18 字數 2219 閱讀 8991

作為乙個正在學習的ios渣渣,演算法、資料結構、作業系統、網路相關已經基礎知識已經忘記差不多了。最近正在總結排序演算法,哎我滴媽,時間複雜度也不會估算,作為程式設計師這就有點可悲了,接下來就一點點點的重新再學一遍吧。先了解一下時間複雜度哇。

演算法時間複雜度定義

在進行演算法分析時,語句總的執行次數t(n)是關於問題規模n的函式,進而分析t(n)隨n的變化情況並確定t(n)的數量級。演算法的時間複雜度,也就是演算法的時間度量,記作:t(n) = o(f(n)),它表示隨著問題規模n的增大而增大,演算法執行時間的增長率和f(n)的增長率相同,稱作演算法的漸進時間複雜度,簡稱時間複雜度。其中f(n)是問題規模n的某個函式。

這樣用大寫o()來體現演算法時間複雜度的記法,稱之為大o記法。

一般情況下,隨著n的增大,t(n)增長最慢的演算法為最優演算法。

時間複雜度計算方法:推導大o階方法

推導大o階:

用常數1取代執行時間中的所有加法常數。

在修改後的執行次數函式中,只保留最高端項。

如果最高端項存在且不是1,則去除與這個項相乘的常數。

得到的結果就是大o階。通過這個步驟,得到演算法的執行次數的表示式後,很快就會得到演算法時間複雜度。

夥伴們注意啦,雖然根據大o階得演算法時間複雜度很容易,但是得到演算法的執行次數的表示式還是需要一點數學功底的。

常見的時間複雜度如o(1)、o(n)、o(n^2)、o(logn),通常叫分別叫他們常數階、線性階、平方階、對數階,那麼接下來看幾個例子。

int

sum = 0, n = 100; //執行一次

sum = (1 + n)/2; //執行一次

上述**執行次數函式是f(n)=2,根據我們推導大o階的方法,第一步就是把常數項2改為1,第二部將保留最高端項發現沒有最高端,所以上述**時間複雜度為o(1)。

int

sum = 0, n = 100;

for(int i = 0; i < n; i ++)

上述**的迴圈時間複雜度為o(n),迴圈體**需要執行n次。

int

count = 1;

while(count

< n)

上述**時間複雜度為o(logn)。while的終止條件為count < n,while的終止條件也就是多少個2相乘大於n,則會退出迴圈。由2^x = n得到x=log2^n,根據大o階第三條「去除與這個項相乘的常數」,所以上述迴圈時間複雜度為logn。

int

sum = 0, n = 100;

for(int i = 0; i < n; i ++)

上述**時間複雜度為o(n^2)。那麼我們考慮將迴圈次數改變一下,比如將第二個迴圈中j從n開始,那麼時間複雜度是怎麼變化的呢?**如下:

int

sum = 0, n = 100;

for(int i = 0; i < n; i ++)

sum計算的次數為:n+(n- 1)+(n- 2)+…+1=n(n+1)/2= n^2/2 + n/2

用推導大o階的方法,第一條,沒有加法常數不用考慮,第二條保留最高端,保留n^2/2,第三條,去除最高項常數,最後得到時間複雜度為o(n^2),與未修改之前的時間複雜度是相同的。

常見的時間複雜度所耗時間的大小排列如下:

0(1)

<0(n2 ) <0(n3 ) <0(2")

最壞的情況執行時間是一種保證,那就是執行時間不會再壞了,通常,除非是特別的指定,我們提到的執行時間都是最壞的情況的執行時間。

平均執行時間是所有情況中最有意義的,因為它是期望的執行時間。也就是說,我們執行一段**時,是希望看到平均執行時間的,可現實中,平均時間複雜度很難通過分析得到,平均時間複雜度需要執行一定數量的實驗資料估算出來的。

時間複雜度介紹到這就結束了。後續學習繼續更新。

此次學習參考了程杰的《大話資料結構》。

演算法時間複雜度空間複雜度

演算法 是解決某一類問題的通法,即一系列清晰無歧義的計算指令。每個演算法只能解決具有特定特徵的一類問題,但乙個問題可由多個演算法解決。乙個演算法應該有以下五個方面的特性 比較演算法的優劣我們從兩個維度去進行考量 時間 空間 時間複雜度,空間複雜度 找出基本語句 演算法中執行次數最多的那條語句就是基本...

演算法 時間複雜度 空間複雜度

1 if i 1 2 a 1 result 3 4 result n 2 result 1000 1000 3 array.push a array.pop 4 map.set 1,1 map.get 1,1 在計算複雜度的時候,o 1 一般會被忽略。1 for let i 0 i n i 2 wh...

演算法複雜度 時間複雜度和空間複雜度

1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數...