【算法分析】如何計算時間複雜度?

前言

有關時間複雜度,我們需要知道:

  1. 時間複雜度不是算法的運行時間。
    時間複雜度可以說是一個模型,這個模型描述了算法的運行時間隨問題規模 N 的變化情況。
    舉個栗子
    某算法的時間複雜度爲:T(N) = O(f(N))
    這個式子的含義存在一個點 n0 ,使得 當 N > n0,T(N) < f(N),從函數圖像上表現爲 T(N) 漸進 f(N)f(N) 的增長率 大於 T(N)
    時間複雜度通常使用大O表示法,就是上面那種,如果題目未指定,就是用大O表示。
    大O表示法是最壞情況的時間複雜度,除了這種情況,還有平均時間複雜度、最好時間複雜度,均攤時間複雜度。【點我瞭解他們的區別】
  2. 比較算法的效率可以看時間複雜的增長率。
  3. 算法的時間複雜度並能通過改進編程得以提高,關鍵還得優化算法。

如何計算時間複雜度

 計算最壞情況複雜度

  1. 順序結構 :所有的語句的運行時間和。
  2. 循環結構 :循環中的語句乘於迭代次數。
  3. 嵌套的循環 :循環中的語句乘於所有循環的大小。
    舉個栗子
	for(i=1;i<=n;i++)
	{
	    for(j=1;j<=i;j++)
	    {
	        x=0;
	        for(k=1;k<=n;k++)
	            x+=a*b;
	    }
	}

   解析:

	三個循環嵌套:
	單獨看三個循環都執行了n次,所以 T(n) = n^3 + n^2
	故時間複雜度爲 T(n) = O( n^3 )
	n^2對 n^3 來說可以忽略。
  1. 條件結構 :if語句的執行時間與else語句執行時間求和。
    舉個栗子
	sum = 0;
	for( i = 1; j < n; j++ )
		for( j = 1; j < i * i; j++ )
			if( j % i == 0 )
				for( k = 0; k < j; k++ )
					sum++;

   解析:

	第一個for循環執行次數:n-1 即 n
	第二個for循環執行次數:n^2 -1 即 n^2
	if語句執行(不考慮 if 真假問題):n^3
	第三個for循環執行:n^2
	當 if 語句爲真時的執行次數:1+2+······+(n-1) 即 1/2 (n-1)n 即 n^2
	故算法的時間複雜度爲:n^2 * n^2 = n^4
  1. 遞歸算法
    遞歸和循環的區別,就是循環都能用遞歸實現,但是有的遞歸卻不能用循環實現,遞歸算法總是向問題規模不斷變小的方向發展。
    首先,我們看一個遞歸能否轉換成循環
    可以轉換爲循環的遞歸,時間複雜度和遞歸的次數成正比。
    舉個栗子
	long fac(int n)
	{
	     if (n>1)
	             return n*fac(n-1)
	             else
	                   return 1;
	}

   解析:

	我們可以發現這是一個計算n!的遞歸,遞歸了n次,所以時間複雜度爲O(n)

   使用分治法主定理分析複雜度
   當問題規模成倍地減少時,我們可以使用這個公式。
   使用問題規模減小問題遞歸求解主定理分析複雜度

   當問題規模不是成倍地減少時,我們可以使用這個公式。
遞歸求解主定理
   除了套公式,我們還可以使用代入法等方法計算

	使用代入法是不斷將原式帶入方程,而不是代入實際數據計算。

   舉個栗子

在這裏插入圖片描述
   【更多方法,點擊這裏】

解題技巧

技巧1
1. 忽略低階和常數對時間複雜度的影響,例如:6n2+n我們經常忽略係數6和低階項n,令其爲n2
2. 如果算法中有循環結構我們通常估算最內層循環體中語句的時間複雜度

技巧2
從嚴蔚敏老師的數據結構中,我們可以將算法中所要研究的時間複雜度語句都當作基本操作,我們只需要找到基本操作的原操作(即算法的時間和原操作的重複執行次數成正比),再確定算法的重複執行次數,時間複雜 = 原操作 * 重複執行次數。

 均攤時間複雜度計算

   如果算法對大部分輸入都能很好的處理(算法性能比較好),但是對個別輸入,算法的性能比較差,我們這裏就可以給使用均攤分析,來確定算法的時間複雜度。均攤結果一般都爲時間複雜度低的結果。【深入瞭解,點我】

 特定算法的時間複雜度

   有些特定算法的時間複雜度不光能幫我們理解時間複雜度模型,還能幫助我們解題,記住一些特定的時間複雜度很有必要。如Java中的動態數組。

  1. 十大排序算法
    在這裏插入圖片描述
    詳情查看菜鳥教程中關於十大排序算法的教程:【點我去到菜鳥教程】
  2. 其他比較常見的算法還需要我們去研究

總結

算法的時間複雜度要求我們要有一定的數學基礎,不能只停留在書面知識,還需要多做練習體驗時間複雜度的計算,和對時間複雜的理解。
學習數據結構書籍推薦
推薦《數據結構與算法分析Java語言描述(Mark Allen Weiss)》
當然也可以參考另一本《數據結構與算法經典問題分析》
這裏我們附上Mark Allen Weiss數據結構書籍課後習題答案(英文版)的鏈接【點我】

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