本系列是極客時間中前 Google 工程師王爭《數據結構與算法之美》專欄的學習筆記,想增強數據結構及算法能力的同窗能夠直接購買此專欄,跳轉連接在此算法
複雜度分析是整個算法學習的精髓,只要掌握了它,數據結構與算法的內容基本上就掌握了一半數據結構
數據結構和算法解決是如何讓計算機更快時間、更省空間的解決問題,所以需從執行時間和佔用空間兩個維度來評估數據結構和算法的性能。數據結構和算法
複雜度描述的是算法執行時間或佔用空間與數據規模的增加關係。性能
算法的執行時間與每行代碼的執行次數成正比,用 T(n) = O(f(n)) 表示。其中 T(n) 表示算法執行總時間,f(n) 表示每行代碼執行總次數,而 n 每每表示數據的規模學習
以時間複雜度爲例,因爲時間複雜度描述的是算法執行時間與數據規模的增加變化趨勢,因此常量階、低階以及係數實際上對這種增加趨勢不產生決定性影響,故在作時間複雜度分析時忽略這些項。cdn
在分析一個算法、一段代碼的時間複雜度的時候,也只關注循環執行次數最多的那一段代碼就能夠了blog
若是 T1(n)=O(f(n)), T2(n)=O(g(n));遞歸
那麼 T(n) = T1(n) + T2(n) = max(O(f(n)), O(g(n))) = O(max(f(n), g(n)))get
能夠把乘法法則當作是嵌套循環:it
若是 T1(n) = O(f(n)), T2(n) = O(g(n))
那麼 T(n) = T1(n) * T2(n) = O(f(n)) * O(g(n)) = O(f(n) * g(n))
多項式階:隨着數據規模的增加,算法的執行時間和空間佔用,按照多項式的比例增加。包括, O(1)(常數階)、O(logn)(對數階)、O(n)(線性階)、O(nlogn)(線性對數階)、O(n^2)(平方階)、O(n^3)(立方階)
非多項式階:隨着數據規模的增加,算法的執行時間和空間佔用暴增,這類算法性能極差。包括, O(2^n)(指數階)、O(n!)(階乘階)
代碼在最理想的狀況下執行的時間複雜度
代碼在最壞狀況下執行的時間複雜度
用代碼在全部狀況下執行的次數加權平均值表示
在代碼執行的全部複雜度狀況中絕大部分是低級別的複雜度,個別狀況是高級別複雜度且發生具備時序關係時,能夠將個別高級別複雜度均攤到低級別複雜度上。基本上均攤結果就等於低級別複雜度
本文更可能是本人學習筆記之用,更多詳細的講解及代碼,請查看極客時間專欄《數據結構與算法之美》