數據結構之複雜度衡量
學數據結構的主要原因:
刷Leetcode算法題,無奈做完第一道Leetcode下面的就更本沒有思路了,對基本的數據結構不瞭解,這麼重要的課程TMD本科竟然不開,垃圾學校,原來還開C++,到了我們那一屆連C++都不開,以至於導致我研一第一學期看SLAM連cout都不知道啥意思,唉……;
互聯網企業筆試常常考這些,知道的有點晚,以至於研一下學期招實習的時候連筆試這關都過不了,哈哈,最後去了一個小公司,趁疫情這段時間,提升一下代碼能力吧,來面對接下來的秋招。開幹,哈哈。
看的書是清華大學燈俊輝編寫的數據結構(C++語言版),具體的視頻在mooc上、B站上都有,可以看看。這種東西應該早學,影響後期寫代碼的功底。不瞎求筆筆了,開幹。
1、算法:
基於特定的計算模型,解決某一信息處理問題而設計的一個指令序列。
2、算法構成的基本要素
- 輸入與輸出
- 基本操作、確定性與可行性:當且僅當可以通過程序設計語言精確地描述
- 有窮性與正確性
- 退化與魯棒性(degeneracy and robustness)
- 重用性:典型形式適用於不同類型基本元素的特性
3、算法效率
- 可計算性
- 難解性
- 計算效率
- 數據結構
4、複雜度度量
4.1 時間複雜度
1、概念:執行時間的變化趨勢可以表示爲輸入規模的一個函數,由於同一算法、同一輸入在不同的硬件平臺上、不同的操作系統中,所需要的計算時間都不盡相同,一種可行的解決辦法將時間複雜度理解爲算法中各條指令的執行時間之和。
2、時間複雜度中的三種記號:
記號 | 衡量情況 |
---|---|
算法的最壞情況 | |
算法的平均情況 | |
算法的最好情況 |
4.2 空間複雜度
1、概念:算法所需存儲空間的多少。
時間複雜度本身就是空間複雜度的一個天然上界。
4.3 複雜度分析
1、複雜度種類:
- 常數時間複雜度
- 對數時間複雜度
- 線性時間複雜度
- 多項式時間複雜度(前面這幾項可以接受)
- 指數時間複雜度(不能稱作算法)
2、輸入規模:描述輸入所需空間規模,影響算法的時間複雜度
重點:如何計算算法的時間複雜度
4.4 遞歸
1、概念:一種基本而典型的算法設計模式
2、如何計算遞歸問題的時間複雜度
- 遞歸跟蹤
- 遞推方程(微分方程)
3、遞歸形式:
- 線性遞歸
- 二分遞歸
- 多分支遞歸
4.5 封裝
1、概念:將數據結構的外部特性與內部實現分離,提供一致且標準的對外接口,隱藏內部的實現細節。