在計算機領域中,經常用時間複雜度和空間複雜的來客觀描述某個演算法或者某段**的執行效率(執行時間)和記憶體消耗(記憶體使用情況)。
在分析某個演算法或者**的執行效率或者記憶體消耗
時,經常能看到 o(1)、o(n) 這類似的表示,它們就是複雜度的表示方法。那它們又是怎麼得到的呢?
現在,用大 o 複雜度表示法,來分析下面這段**的執行時間。
function
cal(n)
return sum;
}
假設:
每條語句的執行時間都是 t,
我們用 :
t(n) 來代表執行這段**執行所需的時間,
f(n) 來代表這段**總共執行了多少條語句,
那麼:可以很容易的得到:
t(n) = f(n) * t。在上面那段**中,第 3 行和第 7 行的執行次數分別是 1,第 4 行和第 5 行的執行次數分別是 n,
那麼:f(n) = 1 + 1 + n + n = 2 + n,
故,示例**的執行時間為:t(n) = (2 + n) * t。
**的執行時間已經得到了。大功告成了嗎?
回顧時間複雜度的概念,會發現,其實並沒有足夠簡潔地表示出資料規模的增大與執行時間的增長趨勢,還需要對上面的t(n) = (2 + n) * t
進行進一步的分析。
由於隨著資料規模的增大,t 其實並不會變化,對執行時間的變化趨勢沒有影響;所有**的執行時間 t(n) 與**的執行總次數 f(n) 成正比
,用o() 表示正比的關係,關於 t(n) 可以得到另乙個公式:
t(n) = o(f(n))在上述例子中,f(n) = 2 + n,則:t(n) = o(2 + n);再去除 f(n) 中的常數項、低階項、係數,只保留最高端的項,就能的到:t(n) = o(n) 。其中:o(n) 就是示例**的時間複雜度啦!
用類似上面的分析方法,也能得到空間複雜度。
第 2 行和第 3 行分別使用了乙個儲存空間,使用的總空間為 2,是個常數,故把空間複雜度表示為 o(1)。
時間複雜度,也被稱為漸進時間複雜度,反映的是隨著資料規模的增大,演算法所需的執行時間的變化趨勢。
1. 計算時的通用的原則
採用上面提到的一步一步分析的方法,的確可以正確地得到時間複雜度,但是,其實是有一些通用的原則,可以幫助我們快速高效的得到最終的時間複雜度。
迴圈優先:重點關注迴圈次數最多的那段**
加法原則:多段並列的**段,取量級最高那個作為最終的時間複雜度
乘法原則:巢狀**段的時間複雜度為內外**時間複雜度的乘積
2. 常見的時間複雜度
常見的時間複雜度以及它們的執行效率由高到低為(越低階的演算法的執行效率越高):
o(1) > o(logn) > o(n) > o(nlogn) > o(n的平方) > o(2的n次方) > o(2!)隨著資料規模的增大,時間複雜度為 o(2的n次方) 或 o(2!) 的演算法的執行時間會呈現出指數級的**增長。
1. o(1) 常量級
一般情況下,只要演算法中不存在迴圈語句、遞迴語句
,即使有成千上萬行的**,其時間複雜度也是ο(1)。
2. o(logn) 對數階
迴圈的執行次數為等比數列的總項數。
例如下面這段**:
function
fn(n)
}
分析一下,首先是迴圈優先原則,執行次數最多的**為第 3 和 第 4 行。每次迴圈,i 的值都乘以 2 ,直到大於 n 才結束迴圈,這個過程中,i 的取值如下:
這裡的 x 就是**的總項數,也就是第 3 和第 4 行**的各自執行次數了。
則 :x = o(log2n) 。
對數之間是可以互相轉換的,在對數階時間複雜度的表示方法裡,我們忽略對數的「底」,統一表示為 o(logn)。
3. o(n) 線性對數階
單層線性迴圈。
4. o(nlogn) 線性對數階
一段時間複雜度為 o(logn) 的**外面巢狀了乙個複雜度為 o(n) 的迴圈。
5. o(m + n)、o(m * n) 涉及 2 個資料規模
o(m + n) 由於無法確定哪個資料規模對執行時間的影響更大,故加法原則失效。
o(m * n) 乘法原則依舊生效。
3. 不同情況下的時間複雜度
最好(情況)時間複雜度、最壞(情況)時間複雜度、(加權)平均(情況)/期望時間複雜度、均攤時間複雜度(涉及攤還演算法)。
空間複雜度,也被稱為漸進空間複雜度,反映的是隨著資料規模的增大,演算法所需的儲存空間的變化趨勢。
空間複雜度的時候,是指除了原本的資料儲存空間外,演算法執行還需要額外的儲存空間。
空間複雜度的計算,就是計算某段**或者演算法在執行過程中,使用到的總的儲存空間數。
重點關注點在於使用的記憶體數量與資料規模之間的關係,也是採用大 o 表示法來表示。因此,也是要忽略常數階、低階、係數,只保留最高端哦!
演算法複雜度 時間複雜度和空間複雜度
1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數...
演算法複雜度 時間複雜度和空間複雜度
演算法複雜度 時間複雜度和空間複雜度 關鍵字 演算法複雜度 時間複雜度 空間複雜度 1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時 間多,哪個演算法花費的時間少就可以...
演算法複雜度 時間複雜度和空間複雜度
演算法的時間複雜度是指執行演算法所需要的計算工作量。n稱為問題的規模,當n不斷變化時,時間頻度t n 也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間複雜度概念。一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t n 表示,若有某個輔助函式f n 存在乙個正...