時間複雜度分析

2021-08-28 17:16:06 字數 2939 閱讀 2298

事後統計法

將**跑一遍,通過統計、監控得到執行時間和占用空間,這種方法有很大的侷限性。

1.1 測試結果非常依賴測試環境

最近有很多同學問我怎麼選一款電腦,我首先會問什麼需求(電腦用來幹什麼?是程式設計開發、還是後期製作、還是遊戲或者是追劇?)。對於後期製作方面,選i7當然比i5好,i7的渲染能力是實測強於i5的。對於遊戲,i7和i5效能發揮差不多,所以買i5處理器划算。當然還需要考慮散熱以及預算等問題。。等等。對於程式設計測試環境的硬體不同會對測試結果有很大影響。

1.2 測試結果受資料規模的影響很大

對於同一種排序演算法,待排序資料的有序度不一樣,排序的執行時間就會有很大的差別。如果測試資料很小,測試結果可能無法真實的反應演算法的效能。

/*求1,2,3,……,n的累加和*/

intadd

(int n)

return sum;

}

假設每行**執行時間一樣為unit_time,t(n)為這段**的執行時間。

t(n) = (2n+2)*unit_time

int

fun(

int n)

}return sum;

}

上面這段**的執行時間為:t(n) = (2n^2 + 2n +3)*unit_time

所有**的執行時間t(n)與每行**的執行次數n成正比

所有就有:t(n) = o(f(n))

大o時間複雜度實際上並不表示具體**真正的執行時間,而是表示**執行時間隨資料規模增長的變化趨勢,也稱為漸進時間複雜度。當n很大時,公式中的低階、常量、係數並不左右增長趨勢,所以可以忽略。

故,以上兩個例子的時間複雜度記為:`t(n)=o(n) t(n) = o(n^2)

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

大o只表示一種變化趨勢,所以在分析乙個演算法、一段**的時候,只關注迴圈執行次數最多的那一段就可以了。

int

fun1

(int n)

return sum;

}

fun1的總時間複雜度為o(n)

3.2 加法原則

總複雜度等於量級最大的那段**的時間複雜度。

int

fun2

(int n)

int sum2 =0;

int q =1;

for(

; q)int sum3 =0;

int i =1;

int j =1;

for(

; i<=n; i++)}

return sum1+sum2+sum3;

}

第一段執行了100次,和n的規模無關。

第二段**時間複雜度為o(n)。

第三段**時間複雜度為o(n^2)。

綜合這三段**的時間複雜度,取最大量級,所以這段**的時間複雜度為o(n^2)。

3.3 乘法原則

巢狀**的複雜度等於巢狀內外**複雜度的乘積。

int

fun1

(int n)

return ret;

}int

fun2

(int n)

return sum;

}

這段**的時間複雜度為:o(n^2)

指數階:o(2^n) 和 階乘階:o(n!)成為非多項式量級。

通常把時間複雜度為非多項式量級的演算法問題成為np問題(non-deterministic polynomial,非確定多項式)。當資料規模n越來越大時,np問題演算法的執行時間會幾句增加,非常低效。

4.1 o(1)
int i =1;

int j =2;

int sum = i + j;

4.2 o(logn)、o(nlogn)
/* 1 */

int i =1;

while

( i<=n )

/* 2 */

int i =1;

while

( i<=n )

1 **的複雜度為log2(n)

2 **的複雜度為log3(n)

對數是可以相互轉換的:log3(n) = log3(2) * log2(n)所以:o(log3(n)) = o(c * log2(n)),其中c是乙個常量,我們忽略係數c。

故將對數階時間複雜度均表示為:log(n)

如果一段**的時間複雜度為log(n),執行了n遍,時間複雜度就為nlogn(n)

4.3 o(m+n)、o(m*n)

int

fun1

(int m,

int n)

int sum2 =0;

int j =1;

for(

; j)return sum1+sum2;

}

這段**的時間複雜度為:o(m+n)

針對這種情況,時間複雜度和m、n均有關,加法原則就不正確了,乘法原則依然正確。

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

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

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

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

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

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