時間複雜度分析

2021-08-04 17:45:10 字數 1649 閱讀 1359

關鍵概念

要分析演算法的複雜度,通常需要分析迴圈的執行.

一,假如,某個迴圈體的複雜度是o(1),那麼這個迴圈的時間複雜度就是o(n).

for(int i = 0; i < n; i++)

通常,如果某個迴圈結構以線性方式執行n次,並且迴圈體的時間複雜度都是o(1),那麼該迴圈的複雜度就是o(n).

即使,該迴圈跳過某些常數部分,只要跳過的部分是線性的,那麼該迴圈體的時間複雜度仍就是o(n).

比如 int count = 1;

while(count < n)

時間複雜度還是o(n)

二,如果迴圈體的複雜度是對數級的 如下

int count = 1;

while(count < n)

該迴圈是o(logn)的, 通常情況是2為底的 也就是o(log2n)

關鍵概念

迴圈的時間複雜度等於該迴圈體的複雜度乘以迴圈的次數…

三,巢狀迴圈複雜度分析…

for(int count1 = 0; count1 < n; count1++)

} 在這種情況下應該 先計算內層迴圈的時間複雜度,然後用內層的複雜度乘以外層迴圈的次數.

最內層迴圈體的時間複雜度都是o(1)所以迴圈n次也就是o(n) 在乘以最外層for的n次.

所以得出結論 2層巢狀迴圈的時間複雜度 = o(1) * n*n = o(n2)

在分析巢狀迴圈複雜度的時候必將內層迴圈和外層虛幻都考慮進來

四,方法呼叫的複雜度分析

假如有如下**

for(int count = 0; count < n; count++)

迴圈的階次等於迴圈體的階次乘以迴圈的次數.像這種情況迴圈體裡頭是乙個方法的呼叫,那麼這個迴圈體的時間複雜度如何呢!

這個方法就是列印1~n的和.所以必須先計算方法體的的時間複雜度.

public void printsum(int count)    

system.out.print(sum);

} 記住,只有可執行的語句才會增加時間複雜度,因此,上面方法裡的內容除了迴圈之外,其餘的可執行語句的複雜度都是o(1),

所以printsum的時間複雜度 = for的 o(n)+o(1) = 忽略常量 = o(n)

但是回想一下,我們讓程式列印1~n的和不需要用for迴圈 記得初中數學課上老師就給出了個公式 num = n*(n+1)/2

改 public void printsum(int count)

此時的 printsum 方法的階次就是o(1) ——–>意味著最外層呼叫此方法的迴圈複雜度就從 o(n2) 改良為 o(n)

這是乙個很大的提高.從這點就可以看出簡單演算法和高效演算法之間的差別了.

五如果乙個方法體是由多個方法呼叫and多個迴圈組成的,那麼其複雜度又如何!

public void suixiangmethod(int n)

for(int i= 0; i       for(int k=0; k

system.out.print(i,k);

} }

suixiangmethod 方法的時間複雜度需要計算方法體的各個成員的複雜度?

也就是1.1+1.2+1.3 = o(1)+o(n)+o(n2) —-> 忽略常數 和 非主要項 == o(n2)

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

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

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

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

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

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