資料結構與演算法之美之 時間複雜度與空間複雜度

2021-10-06 22:19:32 字數 1919 閱讀 6422

時間複雜度:漸進時間複雜度,表示演算法的執行時間與資料規模之間的增長關係(**執行時間隨資料增長的變化趨勢)

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

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

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

常見的時間複雜度:

常量階 o(1)

對數階o(logn)

線性階 o(n)

線性對數階o (nlogn)

平方階o(n²),立方階o(n³).....k次方階o(nk)

空間複雜度:漸進空間複雜度,表示演算法的儲存空間與資料規模之間的增長關係

網友總結

一、什麼是複雜度分析?

1.資料結構和演算法解決是「如何讓計算機更快時間、更省空間的解決問題」。

2.因此需從執行時間和占用空間兩個維度來評估資料結構和演算法的效能。

3.分別用時間複雜度和空間複雜度兩個概念來描述效能問題,二者統稱為複雜度。

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

二、為什麼要進行複雜度分析?

1.和效能測試相比,複雜度分析有不依賴執行環境、成本低、效率高、易操作、指導性強的特點。

2.掌握複雜度分析,將能編寫出效能更優的**,有利於降低系統開發和維護成本。

三、如何進行複雜度分析?

1.大o表示法

1)**

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

2)特點

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

2.複雜度分析法則

1)單段**看高頻:比如迴圈。

2)多段**取最大:比如一段**中有單迴圈和多重迴圈,那麼取多重迴圈的複雜度。

3)巢狀**求乘積:比如遞迴、多重迴圈等

4)多個規模求加法:比如方法有兩個引數控制兩個迴圈的次數,那麼這時就取二者複雜度相加。

四、常用的複雜度級別?

多項式階:隨著資料規模的增長,演算法的執行時間和空間占用,按照多項式的比例增長。包括,

o(1)(常數階)、o(logn)(對數階)、o(n)(線性階)、o(nlogn)(線性對數階)、o(n^2)(平方階)、o(n^3)(立方階)

非多項式階:隨著資料規模的增長,演算法的執行時間和空間占用暴增,這類演算法效能極差。包括,

o(2^n)(指數階)、o(n!)(階乘階)

五、如何掌握好複雜度分析方法?

複雜度分析關鍵在於多練,所謂孰能生巧。

一、複雜度分析的4個概念

1.最壞情況時間複雜度:**在最理想情況下執行的時間複雜度。

2.最好情況時間複雜度:**在最壞情況下執行的時間複雜度。

3.平均時間複雜度:用**在所有情況下執行的次數的加權平均值表示。

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

二、為什麼要引入這4個概念?

1.同一段**在不同情況下時間複雜度會出現量級差異,為了更全面,更準確的描述**的時間複雜度,所以引入這4個概念。

2.**複雜度在不同情況下出現量級差別時才需要區別這四種複雜度。大多數情況下,是不需要區別分析它們的。

三、如何分析平均、均攤時間複雜度?

1.平均時間複雜度

**在不同情況下複雜度出現量級差別,則用**所有可能情況下執行次數的加權平均值表示。

2.均攤時間複雜度

兩個條件滿足時使用:1)**在絕大多數情況下是低級別複雜度,只有極少數情況是高階別複雜度;2)低級別和高階別複雜度出現具有時序規律。均攤結果一般都等於低級別複雜度。

資料結構與演算法之時間複雜度

一般情況下,演算法中的基本操作語句的重複執行次數是問題規模n的某個函式,用t n 表示,若有某個輔助函式f n 使得當n趨近於無窮大時,t n f n 的極限值為不等於零的常數,則稱f n 是t n 的同數量級函式。記作 t n f n 稱 f n 為演算法的漸進時間複雜度,簡稱時間複雜度。t n ...

資料結構與演算法之時間複雜度

度量乙個程式 演算法 執行時間的兩種方法 1 事後統計的方法 這種方法可行,但是有兩個問題 一是要想對設計的演算法的執行效能進行評測,需要實際執行該程式 二是所得時間的統計量依賴於計算機的硬體 軟體等環境因素,這種方式,要在同一臺計算機的相同狀態下執行,才能比較那個演算法速度更快。2 事前估算的方法...

資料結構和演算法之時間複雜度

2.空間複雜度 學習資料結構和演算法,並不是為了死記硬背幾個知識點。我們的目的是建立時間複雜度 空間複雜度意識,寫出高質量的 能夠設計基礎架構,提公升程式設計技能,訓練邏輯思維,積攢人生經驗,以此獲得工作回報,實現你的價值,完善你的人生。掌握了資料結構與演算法,你看待問題的深度,解決問題的角度就會完...