複雜度分析

2022-09-03 02:36:08 字數 1874 閱讀 2276

1 為什麼要對演算法進行複雜度分析?

資料結構與演算法就是為了解決如何更省的儲存資料、如何更快的處理資料的問題,那麼就必須有乙個準則對「更快」、「更省」進行判斷。

ok,可以,既然咱們要分析演算法的執行時間和執行時占用的記憶體,那好辦呀,咱們就在visual studio上把**跑一遍就可以了。

這種測試方法當然是對的,但是對於演算法的複雜度分析來說,卻有兩個缺陷:一是這種測試方法對測試環境依賴很嚴重,例如同一段**在i3和i9上執行,i9上跑的i3快;二是輸入資料的不確定性,輸入資料的規模和有序度都會影響演算法的執行時間。

所以才有了空間、時間複雜度分析。

2 什麼是時間複雜度、空間複雜度?

2.1 時間複雜度:測試執行時間就是計算對執行時間有消耗的基本操作的執行次數,那麼我們可以假設乙個前提,每一行**執行的時間(basetime)是一樣的。例如,

1

long add(intn)2

1213

return

sum;

14 }

外層迴圈每執行一次,內層迴圈執行n次,所以我們知道總共執行次數f(n) = 2n2+n+4,總共執行時間t(n) = f(n) * basetime,也可以表示成t(n) = o(f(n)),『o』表示總執行時間和執行語句數量f(n)成正比,叫做大o複雜度表示法。

大o複雜度並不具體表示**真正的執行時間,而是**執行時間隨資料輸入規模增長的變化趨勢。記錄時我們只需關注最大量級即可,上述例子就可表示成o(n2)。

2.3 時間複雜度分析技巧

1) 只要演算法中不存在迴圈語句、遞迴語句,即使有成千上萬行的**,其時間複雜度也是o(1);

2) 只關注迴圈次數最多的一段**;

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

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

2.4 常見的時間複雜度

o(1) < o(logn) < o(n) < o(nlogn) < o(n2) < o(n3) < o(2n) < o(n!) < o(nn)

2.5 空間複雜度

與時間複雜度類似,空間複雜度表示的是**執行過程中所需儲存空間隨資料輸入規模增長的變化趨勢,同樣可以用大o表示法表示。這裡所需的儲存空間是說除了輸入資料儲存空間外,演算法執行還需額外的儲存空間。 

1 listnode* removenthfromend(listnode* head, int

n) 12

13int j = i + 1 - n; //

待刪除節點序號

14if (1 == j) //

如果刪除的是第乙個節點

1520

else

2125

26return

head;

27 }

該例子中在執行過程中建立了乙個長度為n的容器,空間複雜度為o(n)。

3 最好情況時間複雜度、最壞情況時間複雜度和平均情況時間複雜度

1) 最好情況時間複雜度:最理想的情況下,執行這段**的時間複雜度。

2) 最壞情況時間複雜度:最糟糕的情況下,執行這段**的時間複雜度。

3) 平均情況時間複雜度:平均情況下的時間複雜度。

一般只有在同一塊**在不同的情況下,時間複雜度有量級的差距,才會使用這三種複雜度表示法來區分。

4 均攤時間複雜度

攤還分析法:將特殊耗時多的那次或幾次操作均攤到剩下的n次耗時少的操作上。大多數情況下,均攤時間複雜度都等於最好情況複雜度。

適用場景:對乙個資料結構進行一組連續操作中,大部分情況下時間複雜度都很低,只有個別情況下時間複雜度比較高,而且這些操作之間存在前後連貫的時序關係,這個時候,我們就可以將這一組操作放在一起分析,看是否能將較高時間複雜度的那次操作的耗時,平攤到其他那些時間複雜度比較低的操作上。

複雜度分析 時間複雜度分析和空間複雜度分析

其實,只要講到資料結構與演算法,就一定離不開時間 空間複雜度分析。而且我個人認為,複雜度分析是整個演算法學習的精髓,只要掌握了它,資料結構和演算法的內容基本上就掌握了一半。1.時間複雜度分析 對於剛才羅列的複雜度量級,我們可以粗略地分為兩類,多項式量級和非多項式量級。其中,非多項式量級只有兩個 o ...

複雜度分析 時間複雜度 空間複雜度

執行效率是演算法的乙個重要的考量指標,演算法的執行效率用時間 空間複雜度來衡量。今天我們來學習一下複雜度的分析。通常我們可以通過執行程式來獲得演算法的真正的執行時間,這種方法我們可以稱為事後統計法,但這種方法得到的是具體的資料,測試結果很依賴測試環境,而且受資料規模影像最大。因此,我們需要乙個不需要...

複雜度分析(上)時間複雜度 空間複雜度

為了肉眼 實時 快速地來分析出 的複雜度,我們需要乙個不用具體的測試資料來測試,就可以粗略地估計演算法的執行效率的方法。時間複雜度 空間複雜度 表示演算法的執行時間與資料規模之間的增長關係。每行 對應的 cpu 執行的個數 執行的時間都不一樣,但是,我們這裡只是粗略估計,所以可以假設每行 執行的時間...