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

2020-07-16 10:04:48
演算法,即解決問題的方法。同一個問題,使用不同的演算法,雖然得到的結果相同,但是耗費的時間和資源是不同的。

就比如要擰一個螺母,使用扳手還是鉗子是有區別的,雖然使用鉗子也能擰螺母,但是沒有扳手好用。

“條條大路通羅馬”,解決問題的演算法有多種,這就需要判斷哪個演算法“更好”

演算法VS程式

很多人誤以為程式就是演算法,其實不然:演算法是解決某個問題的想法、思路;而程式是在心中有演算法的前提下編寫出來的可以執行的程式碼。

例如,要解決依次輸出一維陣列中的資料元素的值的問題,首先想到的是使用迴圈結構( for 或者 while ),在有這個演算法的基礎上,開始編寫程式。

所以,演算法相當於是程式的雛形。當解決問題時,首先心中要有解決問題的演算法,圍繞演算法編寫出程式程式碼。

有演算法一定能解決問題嗎?

對於一個問題,想出解決的演算法,不一定就能解決這個問題。

例如擰螺母,扳手相對於鉗子來說更好使(選擇演算法的過程),但是在擰的過程(編寫程式的過程)中發現螺母生鏽擰不動,這時就需要另想辦法。

為了避免這種情況的發生,要充分全面地思考問題,盡可能地考慮到所有地可能情況,慎重選擇演算法(需要在實踐中不斷地積累經驗)。

“好”演算法的標準

對於一個問題的演算法來說,之所以稱之為演算法,首先它必須能夠解決這個問題(稱為準確性)。其次,通過這個演算法編寫的程式要求在任何情況下不能崩潰(稱為健壯性)。

如果準確性和健壯性都滿足,接下來,就要考慮最重要的一點:通過演算法編寫的程式,執行的效率怎麼樣。

執行效率體現在兩方面:
  • 演算法的執行時間。(稱為“時間複雜度”
  • 執行演算法所需的記憶體空間大小。(稱為“空間複雜度”

好演算法的標準就是:在符合演算法本身的要求的基礎上,使用演算法編寫的程式執行的時間短,執行過程中佔用的記憶體空間少,就可以稱這個演算法是“好演算法”。
調查表明,人們對於軟體或者 APP 的執行效率有極高的要求,例如對於網頁開啟的忍耐極限是 6 秒甚至更短,如果你設計的網頁開啟的時間超過 6 秒,多數人會在 4 秒甚至 3 秒的時候毫不猶豫地關掉而去瀏覽其他網頁。在這個大背景下,一個好的“演算法”更注重的是時間複雜度,而空間複雜度只要在一個合理的範圍內就可以。