數據結構與算法——複雜度分析

1、大O複雜度表示法

1.1、從維度劃分

從維度劃分可分爲:時間複雜度、空間複雜度

1.1.1、時間複雜度

概念

代碼執行時間隨數據規模增長的變化趨勢

多項式量級複雜度分析規則(非多項式量級不常見暫不考慮)

順序相加,嵌套相乘,取最高階

階數排序

冪階(n4>n3>n2n^4>n^3>n^2)>線性對數階(nlognnlogn)>線性階(nn)>對數階(lognlogn)>常數階(1)

舉例

int a=0;
for(int i=0;i<n;i++){
	a=a+1;
	for(int j=0;j<n;j++){
		a=a+2;
	}
}
int b=1;
while(b <= n){
  b=b*10;
}

第一行:執行1次

第二行:循環執行n次

第三行:循環執行n次

第四行:循環執行n2n^2

第五行:循環執行n2n^2

第八行:循環執行lognlogn

總計:2n2+2n+logn+12n^2+2n+logn+1次,取最高階T(n)=O(n2n^2)

1.1.2、空間複雜度

概念

算法的存儲空間隨數據規模增長的變化趨勢

舉例

int[] arr = new int[n];

空間複雜度T(n)=O(nn)

1.2、從分析角度劃分(以時間複雜度爲例)

從分析方面可分爲:最好情況時間複雜度、最壞情況時間複雜度、平均情況時間複雜度、均攤時間複雜度

1.2.1、最好情況時間複雜度

概念

在最理想的情況下,執行算法的時間複雜度

1.2.2、最壞情況時間複雜度

概念

在最糟糕的情況下,執行算法的時間複雜度

###1.2.3、平均情況時間複雜度

概念

在所有情況下,執行算法的時間總和的平均值

1.2.4、均攤時間複雜度

概念

​ 大部分情況下時間複雜度都很低,只有個別情況下時間複雜度比較高,而且這些操作之間存在前後連貫的時序關係,這個時候,我們就可以將這一組操作放在一塊兒分析,看是否能將較高時間複雜度那次操作的耗時,平攤到其他那些時間複雜度比較低的操作上

舉例

int a=0;
for(int i=0;i<n;i++){
	a=a+1;
  if(a == x){
    break;
  }
}

最好情況時間複雜度:循環第一次就能跳出循環,時間複雜度爲O(1)

最壞情況時間複雜度:循環到最後一次才跳出循環,或者直到循環結束,時間複雜度爲O(n)

平均情況時間複雜度:循環到中間某次就跳出循環,(1+2+3+...+n+n)(n+1)(1+2+3+...+n+n)\over(n+1)==n2n\over2+1+1-1(n+1)1\over(n+1),T(n)=O(n)

均攤時間複雜度:本例用不到(不太常用就不計算了哈哈)

發佈了61 篇原創文章 · 獲贊 13 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章