汉诺塔递归的空间复杂度_算法分析中的空间复杂度,你真的会了么?
筆者介紹:先后在騰訊和百度采坑,個人公眾號:「代碼隨想錄」,分享自己對互聯網以及技術的想法與思考。歡迎關注!
什么是空間復雜度呢?
一個程序的空間復雜度是指運行完一個算法所需內存的大小。
空間復雜度(Space Complexity)記作S(n) 依然使用大O來表示
利用程序的空間復雜度,可以對程序運行時所需要多少內存有個預先估計。
我這里來回答兩個常見的相關問題
空間復雜度是考慮程序(可執行文件)的大小么?
很多同學都會混淆 程序運行時內存大小和程序本身的大小。
這里我要強調一下空間復雜度是考慮程序運行時占用內存的大小,而不是可執行文件的大小。
空間復雜度是準確算出程序運行時所占用的內存么?
同學們不要以為空間復雜度就已經精準的掌握了程序的內存使用大小
很有多因素會印象程序真正內存使用大小
例如編譯器的內存對齊,編程語言容器的底層實現等等這些都會影響到程序內存的開銷。
所以空間復雜度是預先大體評估程序內存使用的大小。
說到空間復雜度,我想同學們在leetcode上應該遇到過這種錯誤,就是超出內存限制
leetcode上并沒有說他的限制是多大。 但是我們要知道內存不是無限開辟的。
為了避免內存超出限制,這也需要我們對算法占用多大的內存有一個大體的預估。
這就用到了算法空間復雜度的分析。
我們來看一下例子
那么先來看看什么時候的空間復雜度是O(1)
看以下代碼:
int?j?=?0;for?(int?i?=?0;?i?第一段代碼我們可以看出,隨著n的變化,所需開辟的內存空間并不會隨著n的變化而變化
即此算法空間復雜度為一個常量,所以表示為大 O(1)
什么時候的空間復雜度是O(n)?
當消耗空間和輸入參數n保持線性增長,這樣的空間復雜度為O(n)
來看一下這段代碼中
int*?a?=?new?int(n);for?(int?i?=?0;?i?我們new了一個數組出來,這個數據占用的大小為n
雖然有一個for循環,但沒有再分配新的空間,因此,這段代碼的空間復雜度主要看第一行即可
隨著n的增大,開辟的內存大小呈線性增長,即 O(n)
其他的 O(n^2), O(n^3) 我想大家應該都可以以此例舉出來了
那么大家思考一下 什么時候空間復雜度是 O(logn)呢?
空間復雜度是logn的情況確實有些特殊,其實是在遞歸的時候,會出現空間復雜度為logn的情況
至于如何求遞歸的空間復雜度,我會在專門寫一篇文章來介紹的,敬請期待!
總結
以上是生活随笔為你收集整理的汉诺塔递归的空间复杂度_算法分析中的空间复杂度,你真的会了么?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【solo】环境配置
- 下一篇: wireshark抓取网络聊天数据包