時間複雜度與空間複雜度

2021-09-24 04:59:49 字數 2018 閱讀 4688

複雜度是衡量演算法好壞的乙個刻度尺

快/慢就是時間複雜度

使用空間(記憶體)就是空間複雜度

我們知道, cpu每秒執行的指令數是恆定的, 衡量演算法快慢的標準就是演算法執行的基本指令個數, 執行指令個數f(n)和資料規模n有關

現在來了解一下大o漸進法, 這個方法就是極限的方法, 在大o符號表示法中, 時間複雜度的公式是 : t(n) = o(f(n)), 來看乙個例子

for (i = 0; i < n; i++)
假設每行**的執行時間是一樣的, 第一行耗時1, 第二行耗時n, 第三行耗時n, 那麼總的時間複雜度就是(1 + 2n), 而演算法的耗時是隨著n的變化而變化的, 當n無限大的時候, 常量1就沒有意義了, 倍數2的意義也不大, 所以簡化為o(n). 事實上, 大o符號表示法並不是代表演算法的真實執行時間, 而是表示**執行時間的增長變化趨勢.

常見的時間複雜度有 o(1), o(log(n)), o(n), o(n*log(n)), o(n^2), o(2^n) (按時間複雜度從小到大排序)

o(1) : 無論**執行了多少行, 只要沒有複雜的結構, 它的時間複雜度就是1

o(log(n)) : 常見的二分查詢複雜度

o(n) : 簡單for迴圈中常見

舉例 :

o(1)

int i = 1;

int j = 2;

++i;

++j;

int m = i + j;

上述**在執行的時候, 它消耗的時間並不隨著某個變數的增長而增長, 那麼無論這類**有多長, 即使有幾十萬行, 都可以用o(1)來表示它的時間複雜度

o(n)

前面的例子就是這樣, for迴圈裡的**會執行n遍, 因此它消耗的時間是隨著n的變化而變化的, 因此這類**都可以用o(n)來表示它的時間複雜度

o(log(n))

int i = 1;

while(i < n)

可以看到, 在while迴圈裡面, 每次都將 i 乘以 2 , 乘完之後, i 距 n的距離越來越近了, 我們試著求解, 假設迴圈x次後, i 就大於2, 此時這個迴圈就退出了, 也就是2 的 x 次方等於 n, 那麼 x = log2^n, 也就是說迴圈log2^n次之後, 這個**就結束了, 因此這個**的時間複雜度為o(log(n))

o(nlog(n))

線性對數階就是將時間複雜度為o(log(n))的**迴圈n次

for(m =1;mo(n²) (氣泡排序的時間複雜度)

就是把時間複雜度為o(n)的**再巢狀迴圈一次, 時間複雜度就是o(n²)

for(x=1; i<=n; x++)

}

三. 空間複雜度

現在我們知道了, 時間複雜度不是用來計算程式具體耗時的, 那麼, 空間複雜度也不是用來計算程式實際占用的空間的

空間複雜度是對乙個演算法在執行過程中臨時占用儲存空間大小的乙個量度, 同樣反映的是乙個趨勢. 空間複雜度的公式是 : s(n) = o(f(n))

常見的空間複雜度有 : o(1), o(n), o(n²)

o(1)

如果演算法執行所需要的臨時空間不隨著某個變數n的大小而變化, 即空間複雜度為o(1)

int i = 1;

int j = 2;

++i;

++j;

int m = i + j;

o(n)

int m = new int[n]

for(i=1; i<=n; ++i)

這段**中, 第一行就new了乙個陣列出來且這個陣列占用的大小為n, 後面的**雖然有迴圈, 但是沒有再分配新的空間, 所以空間複雜度只看第一行就可以

四. 總結

時間複雜度大o漸進法 : (1)只保留最高次項 (2)最高次項係數化為1

空間複雜度大o漸進法 : (1)計算額外使用的空間大小, 不考慮輸入輸出中用到的空間 (2)常見形式: int array = new int

時間複雜度與空間複雜度

空間複雜度 space complexity 是對乙個演算法在執行過程中臨時占用儲存空間大小的量度,記做s n o f n 比如直接 插入排序 的時間複雜度 是o n 2 空間複雜度是o 1 而一般的 遞迴演算法就要有o n 的空間複雜度了,因為每次遞迴都要儲存返回資訊。乙個演算法的優劣主要從演算法...

時間複雜度與空間複雜度

本文是對時間複雜度以及空間複雜度的乙個理解 時間複雜度 由於環境的不同,同樣的 執行所需要的時間是不同的,所以是不能拿來比較的 而函式中執行的次數確實一樣的 所以時間複雜度就是 程式每個迴圈中的語句總共會執行的次數 時間複雜度的表示方法 大o漸進表示法 o f n 這裡的f n 是什麼呢?void ...

時間複雜度與空間複雜度

本文部分取自搜狗百科 在求演算法效率時,通常有事前分析和事後分析兩種方法,事後分析因為必須實際檢驗過後才能得出答案,且可能由於硬體方面等外部原因影響結果而不被推廣,事前分析的主要就是在考量乙個演算法的基本執行次數,這就是時間複雜度。時間複雜度 一般情況下,演算法中基本操作重複執行的次數是問題規模n的...