時間複雜度和空間複雜度

2021-10-08 23:58:09 字數 2189 閱讀 7752

本文內容是個人對王爭老師極客時間《資料結構與演算法之美》的總結

空間複雜度分析

練習題總結

王爭老師的資料結構與演算法學習,每日更新學習筆記

老師的語言為c,自己使用python

由於測試結果非常依賴測試環境,測試結果手資料規模的影響很大,因此需要乙個不用具體的測試資料來測試演算法執行效率的方法,就是時間複雜度分析和空間複雜度分析。

時間複雜度表示**執行時間隨資料規模增長的變化趨勢。可以解釋說,**的執行時間t(n)與每行**的執行次數n成正比。

只關注迴圈次數最多的一段**,例如:**塊中一段**的時間複雜度為o(n),另一段**的時間複雜度為o(n^ 2),則最後這段**的時間複雜度為o(n^2).

符合加法演算法和乘法演算法。具體分析看以下**部分。

常數階o(1) :

執行常數次**

對數階o(logn)

例如下面**,此**的時間複雜度為o(log2n)。(2為底)

i=1;

while

(i <= n)

線性階o(n) :執行**次數與n有關

線性對數階o(nlogn)

平方階 o(n^2),立方階o(n ^3),k次方階o(n ^k)

指數階o(2^n)

階乘階o(n!)

以下**為c++寫的for巢狀迴圈,每執行一次為o(1)的時間複雜度,前三行的時間複雜度為o(3),每執行一次外層for迴圈,內層執行n次,時間複雜度為o(2n),外層for執行n次,時間複雜度符合加法演算法和乘法演算法,這段**的時間複雜度為o(2n^2+2n+3),只取高階項且忽略係數,最後這段**的時間複雜度為o(n ^2)。

int

cal(

int n)

}}

**如下,此時這段**的時間複雜度

// n表示陣列array的長度

intfind

(int

array,

int n,

int x)

}return pos;

}

此**中的執行次數與x的值有關,這種情況下的時間複雜度由四個量進行衡量:最好,最壞,平均,均攤時間複雜度

x出現在各位置的概率為1/(n+1),包括當陣列滿時。陣列未滿時執行次數都為1,陣列滿時執行次數為n,最後可以得到1*n/(n+1)+n/n+1=2n/(n+1),則平均時間複雜度為o(1)。

將陣列滿時執行次數n均攤到陣列未滿時執行次數為1,則均攤時間複雜度為o(1)

**中陣列,空間複雜度為陣列的空間複雜度

一維陣列:o(n)

二維陣列:o(n^2)

**中有遞迴

遞迴的深度為空間複雜度

既有遞迴又有陣列

兩者中複雜度最大的為空間複雜度

// 全域性變數,大小為10的陣列array,長度len,下標i。

int array=

newint[10

];int len =10;

int i =0;

// 往陣列中新增乙個元素

void

add(

int element)

// new_array複製給array,array現在大小就是2倍len了

array = new_array;

len =

2* len;

}// 將element放到下標為i的位置,下標i加一

array[i]

= element;

++i;

}

最好時間複雜度:o(1)

最壞時間複雜度:o(n)

平均時間複雜度:1/(n+1)+1/(n+1)+…+1/(n+1)+n/(n+1)=2n/(n+1)

,所以平均時間複雜度為o(1)

均攤時間複雜度:o(1)

空間複雜度為:o(n)

寫工程**時要計算時間複雜度和空間複雜度,注重**效率

n<=10時,各量級時間複雜度相近,n越大,各量級時間複雜度差距越大,常數階型最小,指數階型最大

當時間複雜度的與x有關時,要計算最好,最壞,平均(均攤)時間複雜度

均攤時間複雜度是一種特殊的平均時間複雜度

演算法複雜度 時間複雜度和空間複雜度

1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數...

演算法複雜度 時間複雜度和空間複雜度

演算法複雜度 時間複雜度和空間複雜度 關鍵字 演算法複雜度 時間複雜度 空間複雜度 1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時 間多,哪個演算法花費的時間少就可以...

演算法複雜度 時間複雜度和空間複雜度

演算法的時間複雜度是指執行演算法所需要的計算工作量。n稱為問題的規模,當n不斷變化時,時間頻度t n 也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間複雜度概念。一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t n 表示,若有某個輔助函式f n 存在乙個正...