1. 時間複雜度和空間複雜度 (7 天掌握算法面試必考知識點)

全文內容主要源於極客大學的算法課,僅作爲筆記使用。

學習計劃
在這裏插入圖片描述
由於每天都需要寫學習心得和作業,所以寫此貼作爲筆記。也希望可以幫助到有需要的同學。

1、時間複雜度

(1)時間複雜度的統計維度

O(1): Constant Complexity 常數複雜度
O(log n): Logarithmic Complexity 對數複雜度
O(n): Linear Complexity 線性時間複雜度
O(n2): N Square Complexity 平方
O(n3): N CubicComplexity 立方
O(2n): Exponential Growth 指數
O(n!): Factorial 階乘

(2)各時間複雜度的耗時曲線

在這裏插入圖片描述
從圖中可以看出,當n小於5時,不同的時間複雜度耗時差不多。
當n增大時,不同時間複雜度算法耗時差距非常大。所以也就不難理解,大型公司對算法的要求越來越高,是因爲當遇到大數據量處理時,不同的算法能力,需要的服務器成本和代碼性能是有天壤之別的。

(3)算法面試題的四個套件

算法題的內容確認無誤;
思考所有可能解決的辦法;
比較這些方法的時間和空間複雜度;
找出最優的解決方案(時間複雜度最低,兼顧內容使用更少的)

(4)遞歸的時間複雜度分析

將遞歸的執行順序畫出樹形結構,稱爲遞歸狀態的遞歸樹;
主定理計算時間複雜度
比如:斐波那契數列
Fib: 1, 1, 2, 3, 5, 8, 13, 21, 34…
方法定義:F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)

def fib(n: int):
    if n < 2: return n
    return fib(n-1) + fib(n-2)

繪製遞歸圖,以n=6爲例:
在這裏插入圖片描述
常用算法應用主定理:(記住如下算法對應公式,並嘗試理解)
在這裏插入圖片描述

2、空間複雜度

空間複雜度和時間複雜度的情況類似,但是更加簡單。

數組的長度

如果代碼中開了數組,則數組的長度基本就是空間複雜度。
比如:

  • 一維數組,數組長度等於元素個數,則空間複雜度就是O(n)
  • 二維數組,數組長度爲n2,則空間複雜度爲O(n2)

遞歸深度

如果代碼中有遞歸,那麼遞歸最大深度,就是空間複雜度的最大值。如果遞歸裏面又開了數組,那麼兩者中的最大值就是空間複雜度。

實戰分析:
詳見leetcode的爬樓梯示例:爬樓梯題解

3、小結

  • 常用工具配置
  • 基本功和編程指法
  • 常見的時間、空間複雜度分析 對於開發來說,掌握熟悉的工具和TOP用法,能節省開發中的工具使用效率。 對於頂級工程師來說,對自己代碼的時間複雜度和空間複雜度瞭解,是必備技能。

總結

時間複雜度: 假設入參爲n,程序運行的次數與n的關係,即爲時間複雜度。
時間複雜度優化順序:O(1) > O(log n) > O(n) > O(n2) > O(n3) > O(2n) > O(n!)

空間複雜度: 代碼中數組的大小或遞歸深度的最大值。
空間複雜度優化順序:O(1) > O(log n) > O(n) > O(n2) > O(n3) > O(2n) > O(n!)

爲什麼複雜度對於代碼來說如此重要?
從互聯網公司成本來看:

  • 硬件成本:時間複雜度低的代碼,可以降低CPU壓力,減少服務器的CPU成本;空間複雜度低的代碼,可以降低內存佔用,減少服務器的內存成本;
  • 產品成本:時間複雜度和空間複雜度越低,程序執行時間越低和遇到的性能故障越少,產品的性能就會越好,越容易獲取用戶喜歡。
  • 質量評估成本:對設計的算法性能有兩種評測方法,一是運行耗時評估,成本高、不穩定、強依賴硬件,而就是時間複雜度和空間複雜度評估,成本低、準確性高。

參考資料:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章