算法空间复杂度
在 算法時間復(fù)雜度 中,我們一塊了解了算法時間復(fù)雜度相關(guān)的內(nèi)容,比如常見的時間復(fù)雜度、時間復(fù)雜度的計算、以及提供了幾個簡單的例子來推算時間復(fù)雜度。今天就一塊來了解下算法的空間復(fù)雜度。
首先說下空間,拿吃飯舉例子吧:咱們把做好的菜從鍋里吃到肚里是需要碗的吧(你要是就著鍋吃飯那就……),如果鍋里的菜很多你還想一次性弄出來,是不是有兩種方案。一種是找個盡可能大的碗,一種是找很多個碗。算法也是一樣,數(shù)據(jù)從輸入到輸出中間的處理過程是需要容器的,換句話說就是需要空間的。
在上篇介紹時間復(fù)雜度的時候,我們知道了說一個算法的時間復(fù)雜度并不是說一個算法的具體的執(zhí)行時間的。空間復(fù)雜度也同理,并不是說一個算法執(zhí)行需要的具體空間大小。
定義
說下具體的定義吧:算法的空間復(fù)雜度通過計算算法所需的存儲空間實現(xiàn),算法空間復(fù)雜度的計算公式記作:S(n)=O(f(n)),其中,n為問題的規(guī)模,f(n)為語句關(guān)于n所占存儲空間的函數(shù)。
上段話中有個重點需要說下,和我舉的例子也是有關(guān)系的:所需的存儲空間指的是一個算法在運行過程中的臨時占用存儲空間,就像我舉例中的碗一樣,只是臨時用的。
一個算法在計算機存儲器上所占用的存儲空間,包括存儲算法本身所占用的存儲空間,算法的輸入輸出數(shù)據(jù)所占用的存儲空間和算法在運行過程中臨時占用的存儲空間這三個方面。
幾種情況
常量空間
類似于時間復(fù)雜度 O(1),當算法的存儲空間大小固定,和輸入規(guī)模沒有直接的關(guān)系時,空間復(fù)雜度記作O(1)。
int m = 2;線性空間
當算法分配的空間是一個線性的集合(如數(shù)組),并且集合大小和輸入規(guī)模 n 成正比時,空間復(fù)雜度記作 O(n)。
int[] array = new int[n]二維空間
當算法分配的空間是一個二維數(shù)組集合,并且集合的長度和寬度都與輸入規(guī)模 n 成正比時,空間復(fù)雜度記作 O(n2n^2n2)。
int[][] matrix = new int[n][n];類似時間復(fù)雜度,如果為 int[][] matrix = new int[m][n]; 的話,復(fù)雜度就是 O(mnmnmn) 了。
遞歸空間
先說下遞歸吧,說白了就是自己調(diào)用自己,比如下面的代碼:
void fun4(int n){if(n<=1){return;}fun4(n-1);… }再說下遞歸空間吧,正如上述代碼一樣,遞歸代碼中沒有顯示聲明變量或者集合,但是計算機在執(zhí)行程序時,會專門分配一塊內(nèi)存,用來存儲“方法調(diào)用棧”。方法調(diào)用棧包括入棧和出棧兩個操作:
- 當進入一個新方法時,執(zhí)行入棧操作,把調(diào)用的方法和參數(shù)信息壓入棧中。
- 當方法返回時,執(zhí)行出棧操作,把調(diào)用的方法和參數(shù)信息從棧中彈出。
還是上述代碼,假設(shè)現(xiàn)在傳入?yún)?shù) 5,那么方法 fun4(5) 的調(diào)用信息先入棧:
接下來遞歸調(diào)用相同的方法,方法 fun4(4) 的調(diào)用信息入棧:
依次類推,遞歸越來越深,棧內(nèi)的元素也越來越多,最終形成下圖:
當 n=1 的時候,觸發(fā)遞歸的結(jié)束條件,執(zhí)行 return,方法出棧。
最終,所有入棧的元素都會出棧。
由上面“方法調(diào)用棧”的出入棧過程可以看出,執(zhí)行遞歸操作所需要的內(nèi)存空間和遞歸的深度成正比。純粹的遞歸操作的空間復(fù)雜度也是線性的,如果遞歸的深度是n,那么空間復(fù)雜度就是 O(n)。
此部分的棧的相關(guān)特性以后會有博文介紹,請期待~
兩種思想
時間換空間與空間換時間
TODO:等看力扣的時候補充具體的案例
總結(jié)
- 上一篇: sew制动器操作手册_SEW减速机中文操
- 下一篇: Kali dig命令