什麼時間複雜度 空間複雜度,原來不過如此!

2021-10-04 16:34:35 字數 1385 閱讀 5880

很多小夥伴剛學習演算法的時候,是不是對如何看一段**的複雜度很是一頭霧水,或者我們根本就不想去了解什麼複雜度,只要功能實現就ok了。

可是演算法演算法,就是要精益求精,分秒必爭,包括一些演算法考試都是有時間和空間要求的,所以掌握如何看演算法複雜度這個技能十分必要。而且看完這篇文章你就會發現,計算複雜度原來如此簡單

簡單的說,時間複雜度就是計算機基本運算次數所處的等級,其中基本運算就是加減乘除,

for

(int i =

0;i)

就這段**來說,for迴圈執行了n次,共執行了n次加法運算

下面這段**執行了2n次加法運算

for

(int i =

0;i)

顯然 n 次運算 和2n次運算 隨著n的規模不斷增大,其增長趨勢是相同的,所以這樣的**時間複雜度為o(n),表明演算法消耗的時間隨著n的值線性增加,顯然與前面的係數無關,所以o(n)和o(2n)是等價的。

for

(int i =

0;i)}

這段**執行了 n² 次運算,所以時間複雜度為o(n²)。

在時間複雜度中,高等級的冪次會覆蓋低等級的冪次,什麼意思呢?

就是 o(3n²+n+1) 和 o(n²)是等價的。

另外,顯然 o(3n²+n+1) 會趨近於 o(cn²),這裡c是乙個常數,我們稱它為演算法時間複雜度的常數,所以當有些演算法實現複雜的時候,c會變得很大,所以即使這時演算法複雜度相同(一般再說演算法複雜度的時候會忽略前面的係數),效能也會有較大差距。

此外還有o(logn)級別的複雜度,比如二分查詢演算法:

int

binarysearch

(int arr,

int l,

int r,

int target)

在這個演算法中,每次從[ l , r ] 這個區間中去查詢,找到target就停止,中間值比target小就從右邊找,比他大就從左邊找,根據數學知識,我們一共需要log2n次來完成,所以時間複雜度為o(logn)。

還有o(1) ,表明時間複雜度不是線性增長的,所以這幾個時間複雜度有如下幾的關係

o(1) < o(logn) < o(n) < o(n²)

和時間複雜度類似,空間複雜度採用相同的寫法,表示乙個演算法需要消耗的最大資料空間,例如乙個演算法, 最大資料空間為乙個二維陣列,所以他的空間複雜度就是o(n²)。

一般來說,空間基本夠用,其重要性也就不如時間複雜度,所以我們經常採用以空間換時間的方法,比如雜湊法 就是這樣乙個高效的方法。

時間複雜度 空間複雜度

時間複雜度 在電腦科學中,演算法的時間複雜度是乙個函式,它定性描述了該演算法的執行時間。這是乙個關於代表演算法輸入值的字串 的長度的函式。時間複雜度常用大o符號 表述,不包括這個函式的低階項和首項係數。計算時間複雜度的方法 1 只保留高階項,低階項直接丟棄 2 係數不要 3 執行次數是常數是為o 1...

時間複雜度 空間複雜度

演算法複雜度分為時間複雜度和空間複雜度。其作用 時間複雜度是指執行演算法所需要的計算工作量 而空間複雜度是指執行這個演算法所需要的記憶體空間。一 時間複雜度 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道...

時間複雜度 空間複雜度

一 時間複雜度 實際是指程式執行次數,而不是程式執行時間 1.我們一般討論的是最壞時間複雜度,這樣做的原因是 最壞情況下的時間複雜度是演算法在任何輸入例項上執行時間的上限,以最壞代表最全。2.時間複雜度的書寫規則 忽略常數項,用o 1 表示 選取最壞時間複雜度即選取增長最快的項 遞迴的時間複雜度 遞...