《資料結構與演算法之美》學習筆記之複雜度

2021-09-11 08:58:44 字數 1598 閱讀 7624

本系列是極客時間中前 google 工程師王爭《資料結構與演算法之美》專欄的學習筆記,想加強資料結構及演算法能力的同學可以直接購買此專欄,跳轉鏈結在此

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

資料結構和演算法解決是如何讓計算機更快時間、更省空間的解決問題,因此需從執行時間和占用空間兩個維度來評估資料結構和演算法的效能。

複雜度描述的是演算法執行時間或占用空間與資料規模的增長關係。

大 o 表示法

**演算法的執行時間與每行**的執行次數成正比,用 t(n) = o(f(n)) 表示。其中 t(n) 表示演算法執行總時間,f(n) 表示每行**執行總次數,而 n 往往表示資料的規模

特點以時間複雜度為例,由於時間複雜度描述的是演算法執行時間與資料規模的增長變化趨勢,所以常量階、低階以及係數實際上對這種增長趨勢不產生決定性影響,故在做時間複雜度分析時忽略這些項。

複雜度分析法則

只關注迴圈執行次數最多的一段**

在分析乙個演算法、一段**的時間複雜度的時候,也只關注迴圈執行次數最多的那一段**就可以了

加法法則:總複雜度等於量級最大的那段**的複雜度

如果 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)))

乘法法則:巢狀**的複雜度等於巢狀內外**複雜度的乘積

可以把乘法法則看成是巢狀迴圈:

如果 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!)(階乘階)

最好時間複雜度

**在最理想的情況下執行的時間複雜度

最壞時間複雜度

**在最壞情況下執行的時間複雜度

平均時間複雜度

用**在所有情況下執行的次數加權平均值表示

均攤時間複雜度

在**執行的所有複雜度情況中絕大部分是低階別的複雜度,個別情況是高階別複雜度且發生具有時序關係時,可以將個別高階別複雜度均攤到低級別複雜度上。基本上均攤結果就等於低級別複雜度

本文更多是本人學習筆記之用,更多詳細的講解及**,請檢視極客時間專欄《資料結構與演算法之美》

《資料結構與演算法之美》學習筆記 3 資料結構

陣列定義 陣列 array 是一種線性表資料結構。它用一組連續的記憶體空間,來儲存一組具有相同型別的資料。第一是線性表 linear list 顧名思義,線性表就是資料排成像一條線一樣的結構。每個線性表上的資料最多只有前和後兩個方向。除了陣列,鍊錶 佇列 棧等也是線性表結構。而與它相對立的概念是非線...

《資料結構與演算法之美》學習筆記之開篇

本系列是極客時間中前 google 工程師王爭 資料結構與演算法之美 專欄的學習筆記,想加強資料結構及演算法能力的同學可以直接購買此專欄,跳轉鏈結在此 從廣義上講,資料結構就是指一組資料的儲存結構。演算法就是運算元據的一組方法。資料結構和演算法是相輔相成的。資料結構是為演算法服務的,演算法要作用在特...

資料結構與演算法之美學習筆記 5 9章

陣列是一種線性表資料結構,他用一組連續的記憶體空間,來儲存相同型別的資料 這裡要注意不根據下標是不能隨機訪問的啊 假設乙個長度為10的int型陣列,會分配一塊連續記憶體空間 1000 1039,其中,記憶體塊首位址是1000 我們可以通過以下公式快速獲取到指定下標的元素 a i address ba...