算法的時間複雜度、空間複雜度

衡量代碼的好壞包括兩個重要的指標:
1、運行時間
2、佔用空間


  • 時間複雜度:也稱漸進時間複雜度(asymptotic time complexity),指程序(算法)運行時間的長短
  • 空間複雜度:space complexity,指程序在運行過程中臨時佔用存儲空間的大小
  • 兩者都用大O表示法

在做算法分析時,主要討論的是時間複雜度。 從用戶使用體驗上看,更看重的程序執行的速度。一些緩存產品(redis, memcache)和算法本質就是用空間換時間

一、時間複雜度

程序中最常見的四種執行方式:

  • 1)執行次數是線性的,如 T(n)=3nT(n) =3n
  • 2)對數,如 T(n)=5lognT(n) = 5 \log n
  • 3)常量,如 T(n)=2T(n) = 2
  • 4)多項式,如T(n)=n22+n2T(n) = \frac{n^2}{2} +\frac{n}{2}

漸進時間複雜度的概念:若存在函數 fnf(n),使得當 nn 趨近於無窮大時,Tnfn\frac{T(n)}{f(n)} 的極限值爲不等於零的常數,則稱 fnf(n)TnT(n)的同數量級函數。
記作 Tn=OfnT(n)= O(f(n)),稱OfnO(f(n))爲算法的漸進時間複雜度,簡稱時間複雜度
漸進時間複雜度用大寫O來表示,所以也被稱爲大O表示法

推導時間複雜度的 3個原則:

  • 1)如果運行時間是常數量級,用常數1表示
  • 2)只保留時間函數中的最高階項
  • 3)如果最高階項存在,則省去最高階項前面的係數

所以,舉例:

執行次數函數舉例 非正式術語
22 O(1)O(1) 常數階
2n+32n+3 O(n)O(n) 線性階
3n2+2n+13n^2 +2n +1 O(n2)O(n^2) 平方階
5log2n+205\log_2^n +20 O(log2n)O(\log_2^n) 對數階
2n+3nlog2n+192n +3n\log_2^n +19 O(nlog2n)O(n \log_2^n) nlogn階
6n3+2n2+3n+46n^{3} +2n^{2} +3n +4 O(n3)O(n^3) 立方階
2n2^n O(2n)O(2^n) 指數階

注:經常講log2nlog_2^n(以2爲底的對數)簡寫成 lognlogn


二、空間複雜度

S(n)= O(f(n))

  • 常量空間:O(1),存儲空間大小固定,和輸入規模沒有直接關係
  • 線性空間:O(n),空間是一個線性的集合(比如數組),並且集合大小和輸入規模n成正比
  • 二維空間:O(n²)空間是一個二維數組集合,並且集合的長度和寬度都與輸入規模n成正比
  • 遞歸空間:執行遞歸操作所需的內存空間和遞歸的深度成正比。純粹的遞歸操作的空間複雜度也是線性的,如果遞歸的深度是n,那麼空間複雜度就是O(n)

參考《漫畫算法》筆記-上篇,出自於【漫畫算法-小灰的算法之旅 魏夢舒(@程序員小灰)著-】
漫畫:什麼是時間複雜度?

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