數據結構時間複雜度
代碼優化效率
優化目標:衡量程序運行的效率
- 時間複雜度 & 空間複雜度:關注時間或者空間消耗量與輸入數據量之間的關係
計算方法
- 複雜度與具體的常係數無關
- 多項式級的複雜度相加時,選擇高者做爲結果
- O ( 1 ) O(1) O(1) 也表示一個特殊複雜度,與輸入數據量 n n n 無關
複雜度與程序之間的關係
- 時間複雜度與 代碼結構 高度相關
- 一個順序結構的代碼,時間複雜度是 O ( 1 ) O(1) O(1)
- 二分查找,採用分而治之的二分策略,時間複雜度是 O ( l o g n ) O(logn) O(logn)
- 一個簡單的for循環,時間複雜度是 O ( n ) O(n) O(n)
- 兩個順序執行的for循環,時間複雜度是 O ( n ) O(n) O(n)
- 兩個嵌套的for循環,時間複雜度是 O ( n 2 ) O(n^2) O(n2)
- 空間複雜度與 數據結構的選擇 高度相關
如何下降複雜度呢?
- 第一步:暴力解法。在沒有任什麼時候間、空間約束下,完成代碼任務的開發。
- 第二步:無效操做處理。將代碼中的無效計算,無效存儲剔除,下降時間或空間複雜度。
- 第三步:時空轉換。設計合理數據結構,完成時間複雜度向空間複雜度的轉移。
數據處理基本操做:增刪查
-
前提:要想靈活使用數據結構,須要先弄清楚數據在代碼中被處理、加工的最小單位動做,也就是數據結構的基本操做。數據結構
-
代碼對數據的處理(可操做性類型少),而數據處理的操做就是找到須要處理的數據,計算結果,再進行保存便可。總結以下:優化
- 找到要處理的數據。這就是按照某些條件進行查找。
- 把結果存到一個新的內存空間中。這就是在現有數據上進行新增。
- 把結果存到一個已使用的內存空間中。這須要先刪除內存空間中的已有數據,再新增新的數據。
-
基於數據處理操做分析,全部的代碼對數據的處理也只有這 3 個基本操做(增刪查),如何進行分析找到解決問題的最優方案呢?spa
- 首先,這段代碼對數據進行了哪些操做?
- 其次,這些操做中,哪一個操做最影響效率,對時間複雜度的損耗最大?
- 最後,哪一種數據結構最能幫助你提升數據操做的使用效率?