一. 為什麼要進行時間複雜度分析
當我們有多種方法可以解決問題時,我們需要學習如何比較不同演算法的效能,並選擇最佳演算法來解決特定問題。在分析演算法時,我們主要考慮時間複雜度和空間複雜度。演算法的時間複雜度根據輸入長度來量化演算法執行所需的時間。類似地,演算法的空間複雜度將演算法占用的空間或記憶體量量化為輸入長度的函式。
時間和空間的複雜性取決於許多因素,例如硬體,作業系統,處理器等。但是,在分析演算法時,我們不考慮任何這些因素。我們將只考慮演算法的執行時間。在不同的硬體環境,測試同樣乙份**其效果是不一樣的。那麼複雜度分析具有成本低,效率高的特點。
二. 歸納總結
根據筆者的歸納總結,在計算時間複雜度時,常常使用三種不同的函式符號來表示不同函式之間的限制。o符號經常用於表示漸進上限。對於給定的g(n),我們可以使用o(g(n))來表示存在正常數c和n0,這樣0 <= f(n) <=cg(n) 對所有n>=n0都成立。ω符號經常用於表示漸近下界。對於給定的g(n),我們可以用 ω(g(n)) 來表示存在正常數c和n0,這樣0 <=cg(n) <= f(n) 對於所有n>n0都成立。θ符號經常用於表示漸近緊邊界。對於給定的g(n),我們可以用θ(g(n))來表示存在正常數c1,c2和n0,這樣0 <=c1g(n)<=f(n)<=c2g(n)對所有n>n0都成立。為了方便理解,筆者附上三張用於顯示時間複雜度的圖。
在分析演算法時,我們主要考慮o符號,因為它會給我們執行時間的上限,即最壞情況下的執行時間。計算o時要注意,我們將忽略低階術語,因為對於大輸入而言,低階項將變得相對無關緊要。舉個簡單的例子,假設給出乙個這樣的函式 f(x) = x^2 + 2x +5. 那麼它的時間複雜度就是 o(f(x))=o(x^2)
三. 時間複雜度的應用以及理解
接下來,筆者將描述在研究時間複雜度時遇到的一些問題,以及筆者對時間複雜度在程式演算法應用上的理解。
func sum (n int) int
if n%2==0
return sum
} temp := (n-1) / 2
for i:=0;i<=temp-1;i++
sum=sum+1
return sum
}
例如這段**,第一次判斷語句的時間複雜度為o(1),第二次判斷語句的時間複雜度為o(n), for 迴圈中的時間複雜度為o(n),因此其最大的時間複雜度為o(n),則總的時間複雜度為o(n)。
計算非正常迴圈時,應該考慮其其他情況。
func print(n int) string
return plus(n-1) + plus(n-2)
}
這裡使用到了斐波那契數列,t(n) = t(n - 1) + t(n - 2)。用歸納證明法可以證明,當 n >= 1 時 t(n) < (5/3)^n,同時當 n > 4 時 t(n) >= (3/2)^n。因此其時間複雜度為 o((5/3)^n)。
四. 為什麼要進行空間複雜度分析
空間複雜度是指演算法在記憶體內所需要的儲存空間的度量,一般是指除正常占用記憶體開銷外的輔助儲存單元規模。和時間複雜度類似,這樣標記:s(n)=o(f(n))。對於乙個演算法,其時間複雜度和空間複雜度往往是相互影響的。當追求乙個較好的時間複雜度時,可能會使空間複雜度的效能變差,即可能導致占用較多的儲存空間;反之,當追求乙個較好的空間複雜度時,可能會使時間複雜度的效能變差,即可能導致占用較長的執行時間。
五. 總結歸納
筆者認為在計算空間複雜度時,計算的方式與計算時間複雜度時頗為相似。輸入資料所佔空間只取決於問題本身,和演算法無關,則只需分析除輸入和程式之外得輔助變數所佔額外空間。首先,明確乙個概念,演算法的儲存量包括:程式本身所佔空間,輸入資料所佔空間,輔助變數所佔空間。
func sum (n int) int
return plus(n-1) + plus(n-2)
}
運用遞迴實現時,呼叫fun函式,每次都執行一次判斷語句。執行n次,空間複雜度o(n*1)=o(n)。 關於時間複雜度和空間複雜度
如何判別乙個演算法的好壞 首先,這個演算法必須是正確的 其次,好的演算法應具有幸福感,便於人們理解和交流,並且是機器可執行的。這個演算法還需要足夠健壯,即當輸入的資料非法或不合理時,也能適當的做出正確的反應或進行相應的處理 最後它還必須擁有高效率和低儲存量要求。也就是時間複雜度和空間複雜度佔的地方越...
關於時間複雜度和空間複雜度
空間複雜度 大o表示法是演算法的漸進時間複雜度,感覺是從數量級?的角度來描述演算法時間複雜度的增長趨勢?大o表達其實表示的不是精確的時間消耗,而是關注其屬於的量級。比如o n n 2 o n 2 而過分糾結o 2n o 3n 和o 2n 3n 是沒有意義的,因為其全可以表達為o n 看該演算法以怎樣...
演算法複雜度 時間複雜度和空間複雜度
1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數...