java筆試攻略——Base系列(時間複雜度和空間複雜度)

首先明確,時間複雜度和空間複雜度都不是指一個具體的數值,只是用來估算的比較接近實際的函數
時間複雜度:一個算法執行所耗費的時間
n表示基本操作模塊被執行的次數,時間複雜度常用大寫O符號表示,叫做大O階記法
1 用常數1表示運行時間中加法常數
2 在最後算出的運行次數函數中,只保留高階項
3 如果高階項存在且不是1,則去除它的常數係數

int n = 100000; //執行了1次
	for(int i = 0; i < n; i++){  //執行了n+1次
	  for(int j = 0; j < n; j++) //執行了n*(n+1)次
	  {
	      printf("i = %d, j = %d", i, j); //執行了n*n次
	  }
	}

	for(int i = 0; i < n; i++){  //執行了n+1次
	  printf("i = %d", i); //執行了n次
	}

	printf("Done"); //執行了1次

第一步:用常數1取代運行時間上所有加法常數,執行總次數 = 2n^2 + 3n + 1;
第二步:保留最高項,執行總次數 = 2n^2
第三步:最高項存在,且不是1,去除它的常數係數,執行總次數 = n^2;
所以最後的出的算法時間複雜度爲:O(n^2)

經驗總結:
當程序中出現一層for循環時,時間複雜度是n,當出現了兩層for循環時,時間複雜度是n^2,但是
如果其中在循環體裏面,控制循環參數i發生了變化時,就要詳細對時間複雜度進行計算。
有時候可以利用歸納法
如:嵌套一層for循環的時間複雜度爲:O(n),二層for循環爲O(n^2),二分的算法時間複雜度爲:O(logn),如果一個for循環套一個二分,那麼時間複雜度爲O(nlogn);
常見的時間複雜度
O(1),O(logn),O(n),O(n^2)
空間複雜度:運行完一個程序所需內存的大小
當一個算法的空間複雜度爲一個常量,即不隨處理數據量n的變化而變化時,可表示爲O(1)
當一個算法的空間複雜度以2爲底的n的對數成正比時,可表示爲log2n
當一個算法空間複雜度與n成線性比例關係時,可表示爲O(n)

時間複雜度和空間複雜度都取到最小的情況是不存在的,小的時間複雜度必定會帶來大的空間複雜度,大的空間複雜度可以減少時間複雜度,具體如何取捨就看自己的權衡了,一般情況下,
我們都會選擇犧牲空間複雜度換取更高的代碼運行效率。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章