什麼才是真正的空間複雜度?
到底什麼才是真正的空間複雜度呢?在空間與時間發生衝突時又該如何權衡呢?
本節,我們就來解決這兩個問題。
來個例子
現在有一個演算法是這樣的,給定一個陣列,將陣列中每個元素都乘以2返回,我實現了下面兩種形式:
private
static
int[] multi1(
int[]
array) {
int[] newArray =
new
int[
array.length];
for (
int i =
0; i <
array.length; i++) {
newArray[i] =
array[i] *
2;
}
return newArray;
}
private
static
int[] multi2(
int[]
array) {
for (
int i =
0; i <
array.length; i++) {
array[i] =
array[i] *
2;
}
return
array;
}
暫且不論這兩個演算法孰好孰壞,你來猜猜他們的空間複雜度各是多少?
你可能會說第一個演算法的空間複雜度為O(n),第二個演算法的空間複雜度為O(1)。
錯!兩個演算法的空間複雜度都是O(n)。
也不能說你完全錯了,因為大部分書籍或者資料都弄錯了。
是時候瞭解真正的空間複雜度了。
空間複雜度與額外空間複雜度
空間複雜度,是指一個演算法執行的過程佔用的空間,這個空間包括輸入引數的佔用空間和額外申請的空間。
所以,針對上面兩個演算法:
- 第一個演算法,輸入引數n,額外空間n,兩者相加為2n,去除常數項,空間複雜度為O(n);
- 第二個演算法,輸入引數n,額外空間0,兩者相加為n,空間複雜度為O(n)。
可以看到,使用空間複雜度很難判斷這兩個演算法的好壞,所以,誕生了另一個概念——額外空間複雜度。
額外空間複雜度,是指一個演算法執行過程中額外申請的空間。
使用額外空間複雜度,針對上面兩個演算法:
- 第一個演算法,額外空間為n,額外空間複雜度為O(n);
- 第二個演算法,額外空間為0,額外空間複雜度為O(1);
似乎沒見過有O(0)這種寫法。
可以看到,使用額外空間複雜度能夠很輕易地判斷兩個演算法的好壞(從空間佔用的角度)。
所以,是時候糾正錯誤的概念了,以後與人交流的時候請使用“額外空間複雜度”這個概念。
時間與空間的權衡
時間與空間往往是一組糾纏在一起的概念,就像很多小說中寫的一樣,主角最終領悟了時空法則,成為了最強者,小說結束。
在資料結構與演算法中也是一樣,時間與空間往往同時出現,而且經常朝著相反的方向運動。
比如,對於排序演算法:
- 氣泡排序,時間複雜度O(n^2),空間複雜度O(1)
- 歸併排序,時間複雜度O(nlogn),空間複雜度O(n)
所以,有兩種思想:以時間換空間,以空間換時間。
那麼,哪種演算法更好呢?
我覺得吧為,如果有時間、空間同時比較小的為最好,退而求其次,我選擇以空間換時間,畢竟,隨著計算機硬體技術地不斷髮展,空間越來越不值錢,而時間卻越來越值錢,所以,以空間換時間也是一種常用的思想,在我們後續的課程中會出現大量以空間換時間的案例。
後記
本節,我們從一個小例子入手,分析了兩種演算法的空間複雜度,並引出空間複雜度的真身——額外空間複雜度,最後,透過對比氣泡排序和歸併排序的時間複雜度和空間複雜度,得出了以空間換時間的思想。
到這裡,關於複雜度相關的章節就寫完了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69923331/viewspace-2707654/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 到底什麼才是真正的空間複雜度?複雜度
- 時間複雜度與空間複雜度時間複雜度
- 時間複雜度和空間複雜度時間複雜度
- 時間複雜度跟空間複雜度時間複雜度
- 時間複雜度O(n)和空間複雜度時間複雜度
- 我們常說的演算法時間複雜度和空間複雜度到底是什麼?演算法時間複雜度
- 122 演算法的時間複雜度和空間複雜度詳解演算法時間複雜度
- 時間與空間複雜度分析複雜度
- 演算法的空間複雜度演算法複雜度
- 那些年忽略的知識:時間複雜度和空間複雜度詳解時間複雜度
- PHP 演算法基礎----時間複雜度和空間複雜度(轉載)PHP演算法時間複雜度
- 易被忽略的知識點之 ---- 各種時間複雜度和空間複雜度時間複雜度
- 資料結構與演算法(一):帶你瞭解時間複雜度和空間複雜度到底是什麼?資料結構演算法時間複雜度
- 時間複雜度怎麼算?如何計算時間複雜度?時間複雜度
- 冰與火之歌:「時間」與「空間」複雜度複雜度
- 什麼才是真正的雲原生?
- 說說你對演算法中時間複雜度,空間複雜度的理解?如何計算?演算法時間複雜度
- 最詳細的解說—時間和空間複雜度複雜度
- 一文講透演算法中的時間複雜度和空間複雜度計算方式演算法時間複雜度
- 日常分享:關於時間複雜度和空間複雜度的一些優化心得分享(C#)時間複雜度優化C#
- 資料結構-邏輯關係&物理關係、時間複雜度、空間複雜度、順序表資料結構時間複雜度
- 自學 資料結構四月二十一日_時間複雜度&空間複雜度資料結構時間複雜度
- 如何不用演算法對陣列進行(0時間複雜度,0空間複雜度)排序?演算法陣列時間複雜度排序
- 1. 時間複雜度和空間複雜度 (7 天掌握演算法面試必考知識點)時間複雜度演算法面試
- 時間複雜度的計算時間複雜度
- 淺談時間複雜度時間複雜度
- dfs時間複雜度分析時間複雜度
- 時間複雜度(詳解)時間複雜度
- 圖解時間複雜度圖解時間複雜度
- 常用的時間複雜度分析方法時間複雜度
- 演算法的時間複雜度演算法時間複雜度
- 二叉樹的 Morris 中序遍歷——O(1)空間複雜度二叉樹複雜度
- DDD之理解複雜度、尊重複雜度、掌控複雜度複雜度
- 第一週:時間複雜度該怎麼看?時間複雜度
- 簡單程式的時間複雜度分析時間複雜度
- 【簡單演算法】什麼是複雜度?演算法複雜度
- JavaScript 資料結構與演算法之美 - 時間和空間複雜度JavaScript資料結構演算法複雜度
- 衡量演算法的效能-時空複雜度分析演算法複雜度