學習LeetCode前的準備工作

前言

最近決定重學數據結構與算法,同時結合LeetCode實踐來刻意練習。持續專注不變的底層知識。

以下根據《重學數據結構和算法》學習筆記整理和思考總結。

01.複雜度:如何衡量程序運行的效率?

  1. 複雜度分爲:時間複雜度、空間複雜度。

  2. 時間複雜度的計算和代碼的結構,代碼的執行次數有關係。

  3. 空間複雜度的計算和數據結構,存儲資源有關係。

  4. 複雜度和常係數無關如:O(n)、O(2n)、O(n/2)都表示O(n)複雜度

  5. 多個複雜度相加,取高次項複雜度爲最終結果,如:O(n3+n2+n)那麼這個複雜度就是O(n^3)

  6. 常見的一些時間複雜度有:
    (1)對一個數組遍歷循環,若數組長度爲n,那麼時間複雜度爲O(n)。
    (2)嵌套遍歷,若外層遍歷n次,內層遍歷m次,則時間複雜度爲O(m*n)。
    (3)若兩個遍歷不是嵌套的,還是順序的,那麼時間複雜度依然是O(n)+O(n) = O(2n) = O(n),最終依然爲O(n)。
    (4)若n和程序執行的次數無關,那麼時間複雜度始終爲O(1);比如針對一個長度爲n的字符串直接進行輸出操作,不管長度爲多長,始終只需輸出一次。

    (5)O(1)也是表示一個特殊的複雜度,爲某個任務通過有限可數的資源即可完成。與輸入的數量n無關。

  7. 優化時間複雜度很重要,處理10萬的數據,程序結構定下的不同的時間複雜度,讓計算機計算的次數是有天壤之別的。

我們給出一些經驗性的結論:

  1. 一個順序結構的代碼,時間複雜度是 O(1)。
  2. 二分查找,或者更通用地說是採用分而治之的二分策略,時間複雜度都是 O(logn)。
  3. 一個簡單的 for 循環,時間複雜度是 O(n)。
  4. 兩個順序執行的 for 循環,時間複雜度是 O(n)+O(n)=O(2n),其實也是 O(n)。
  5. 兩個嵌套的 for 循環,時間複雜度是 O(n²)。

高手進階:寫完代碼後能評估代碼的複雜度,並能進行優化,追求極客精神。

02 數據結構:將“昂貴”的時間複雜度轉換成廉價的空間複雜度

降低時間複雜度方法有:遞歸、二分法、排序法、動態規劃。

降低空間複雜度:圍繞數據結構。

  • 數組 數組長度決定,空間複雜度o(n)

  • 遞歸 根據遞歸的深度可達到 o(n)

  • ……

    小結:關於數據結構如何降低空間複雜度,可以根據LeetCode中爬樓梯的算法中的官方解答來進一步瞭解

程序優化最核心思路:

  1. 暴力解法。有沒有任何時間、空間約束下,完成代碼的任務開發。
  2. 無效操作處理。將代碼中的無效計算、無效存儲剔除,降低時間或空間的複雜度。
  3. 時空轉換。設計合理的數據結構,完成時間複雜度向空間複雜度的轉移。

參考資料:

如何理解算法時間複雜度的表示法,例如 O(n²)、O(n)、O(1)、O(nlogn) 等?

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