衡量代碼的好壞包括兩個重要的指標:
1、運行時間
2、佔用空間
- 時間複雜度:也稱漸進時間複雜度(asymptotic time complexity),指程序(算法)運行時間的長短
- 空間複雜度:space complexity,指程序在運行過程中臨時佔用存儲空間的大小
- 兩者都用
大O表示法
在做算法分析時,主要討論的是時間複雜度
。 從用戶使用體驗上看,更看重的程序執行的速度
。一些緩存產品(redis, memcache)和算法本質就是用空間換時間。
一、時間複雜度
程序中最常見的四種執行方式:
- 1)執行次數是線性的,如
- 2)對數,如
- 3)常量,如
- 4)多項式,如
漸進時間複雜度的概念:若存在函數 ,使得當 趨近於無窮大時, 的極限值爲
不等於零的常數
,則稱 是的同數量級函數。
記作 ,稱爲算法的漸進時間複雜度,簡稱時間複雜度
。
漸進時間複雜度用大寫O
來表示,所以也被稱爲大O表示法
。
推導時間複雜度的 3個原則:
- 1)如果運行時間是常數量級,用常數1表示
- 2)只保留時間函數中的最高階項
- 3)如果最高階項存在,則省去最高階項前面的係數
所以,舉例:
執行次數函數舉例 | 階 | 非正式術語 |
---|---|---|
常數階 | ||
線性階 | ||
平方階 | ||
對數階 | ||
nlogn階 | ||
立方階 | ||
指數階 |
注:經常講(以2爲底的對數)簡寫成
二、空間複雜度
S(n)= O(f(n))
- 常量空間:
O(1)
,存儲空間大小固定,和輸入規模沒有直接關係 - 線性空間:
O(n)
,空間是一個線性的集合(比如數組
),並且集合大小和輸入規模n
成正比 - 二維空間:
O(n²)
空間是一個二維數組集合,並且集合的長度和寬度都與輸入規模n
成正比 - 遞歸空間:執行遞歸操作所需的內存空間和遞歸的深度成正比。純粹的遞歸操作的空間複雜度也是線性的,如果遞歸的深度是
n
,那麼空間複雜度就是O(n)
參考《漫畫算法》筆記-上篇,出自於【漫畫算法-小灰的算法之旅 魏夢舒(@程序員小灰)著-】
漫畫:什麼是時間複雜度?