《數據結構與算法之美》學習筆記之複雜度

本系列是極客時間中前 Google 工程師王爭《數據結構與算法之美》專欄的學習筆記,想增強數據結構及算法能力的同窗能夠直接購買此專欄,跳轉連接在此算法

複雜度分析是整個算法學習的精髓,只要掌握了它,數據結構與算法的內容基本上就掌握了一半數據結構

什麼是複雜度分析

數據結構和算法解決是如何讓計算機更快時間、更省空間的解決問題,所以需從執行時間和佔用空間兩個維度來評估數據結構和算法的性能。數據結構和算法

複雜度描述的是算法執行時間或佔用空間與數據規模的增加關係。性能

如何進行復雜度分析

大 O 表示法

來源

算法的執行時間與每行代碼的執行次數成正比,用 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))

總結
  1. 單段代碼看高頻:好比循環
  2. 多段代碼取最大:好比一段代碼中有單循環和多重循環,那麼取多重循環的複雜度
  3. 嵌套代碼求伺機:好比遞歸、多重循環等
  4. 多個規模求加法:好比方法有兩個參數控制兩個循環的次數,那麼這時就取兩者複雜度相加

經常使用複雜度級別

  1. 多項式階:隨着數據規模的增加,算法的執行時間和空間佔用,按照多項式的比例增加。包括, O(1)(常數階)、O(logn)(對數階)、O(n)(線性階)、O(nlogn)(線性對數階)、O(n^2)(平方階)、O(n^3)(立方階)

  2. 非多項式階:隨着數據規模的增加,算法的執行時間和空間佔用暴增,這類算法性能極差。包括, O(2^n)(指數階)、O(n!)(階乘階)

最壞、最好、平均及均攤時間複雜度

最好時間複雜度

代碼在最理想的狀況下執行的時間複雜度

最壞時間複雜度

代碼在最壞狀況下執行的時間複雜度

平均時間複雜度

用代碼在全部狀況下執行的次數加權平均值表示

均攤時間複雜度

在代碼執行的全部複雜度狀況中絕大部分是低級別的複雜度,個別狀況是高級別複雜度且發生具備時序關係時,能夠將個別高級別複雜度均攤到低級別複雜度上。基本上均攤結果就等於低級別複雜度

聲明

本文更可能是本人學習筆記之用,更多詳細的講解及代碼,請查看極客時間專欄《數據結構與算法之美》

相關文章
相關標籤/搜索