查看單個文章
舊 2016-10-10, 09:08 PM   #2 (permalink)
mini
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:96 | 在線時長:9665小時 | 升級還需:132小時級別:96 | 在線時長:9665小時 | 升級還需:132小時級別:96 | 在線時長:9665小時 | 升級還需:132小時級別:96 | 在線時長:9665小時 | 升級還需:132小時級別:96 | 在線時長:9665小時 | 升級還需:132小時級別:96 | 在線時長:9665小時 | 升級還需:132小時
註冊日期: 2002-12-07
文章: 13249
精華: 0
現金: 26241 金幣
資產: 3024051 金幣
預設



所謂 空間複雜度 就是指
記憶體使用量在"執行階段"
會出現"多" 「不可預期」的程度
或稱
需考量的程度
(越複雜就越難掌控,程式容易出現溢位錯誤,也就是異常終結,甚至形成駭客進入的罩門)

不同程式語言會有不同的 複雜度
你貼的是 C/C++
需注意兩點
1.在 C語言上沒有所謂的 變動陣列 (除非你用鏈結來取代傳統陣列)
也就是在宣告時你要盡量宣告出足以應付的陣列大小

P.S.這一點就解釋你的疑問「明明隨著n越大,會有越多個list[i]...」,n也不能超過 宣告的陣列長度
2.存放 計算結果 的變數類型 須考量兩者誰大誰小(能代表的量),需考量用大者來當 存放計算結果之變數

舉個例:a=a+f
如要說複雜度從1~10分級的話 (越高越複雜)
其複雜度可以說是 2
因為只需考量變數 a可以容納相加結果就沒問題 (比如 uint32 可以代表的量範圍是 0~FFFFFFFF)

狀況1: 如 f 是變數複雜度會提升一級(但也是固定值,空間複雜度不變)
狀況2: 如 f 是常數那複雜度會變低一級(同樣)
狀況3: 如 f 是陣列那相當於狀況1
你舉的 tempsum += list [i]; 就是狀況3
因為一個float變數就能應付 (相加結果不要大於小於 float變數能代表的量就好了)


P.S.
tempsum 與 list[] 都是 float變數,所以複雜度單純
如是不同類型變數,tempsum需為大容量變數
比如 float能裝的下int代表量,如tempsum是int、list[]是float就會出問題


那什麼情況複雜度會變化
比如 VB語言的string變數
string變數可以不斷的串連/縮減 變更
例子:
Dim s as string
for i=0 to n
s=s & cstr(i)
next
n是輸入值的話
空間複雜度就會受輸入影響,因為記憶體使用空間會隨n作變化
而且呈現等比級數增加

==========
說起來 "空間複雜度" 這是早期的觀念
現代程式語言 語法設計越來越嚴僅
加上強化 容錯處理
除非你要設計小而美的軟體(比如行動裝置記憶體小就要考量這)
不然很少人會考量這麼多

此帖於 2016-10-10 09:40 PM 被 mini 編輯.
mini 目前離線  
送花文章: 1999, 收花文章: 7957 篇, 收花: 26749 次
回覆時引用此帖
向 mini 送花的會員:
alanniok (2016-10-13)
感謝您發表一篇好文章