【程式設計珠璣】第十章 節省空間
一,概述
1)節省空間帶來的好處
程式變小使得載入更快;更容易讀入快取記憶體;需要操作的資料減少從而減少操作時間。
2)節省空間的方法
數學函式式替代要儲存的資料。簡單例子為:a[i]=i 。如果你要讀取陣列第i個元素只需要通過函式f(i) = i得到元素值,而不需要將所有資料儲存在陣列中。
改變資料結構。如果一個數字範圍為0-200,則完全沒有必要採用32位的int型儲存,只需要採用8位的無符號char型儲存即可。
連結串列替代稀疏二維陣列。雖然指標也需要空間儲存,如果二維陣列儲存很少的資料,則可以考慮權衡一下是否要用連結串列代替稀疏二維陣列。(陣列表示列,連結串列表示行的方式。而不是單鏈表)
3)減少程式所需資料的儲存空間的技術
1> 不儲存,重新計算。
典型的時間換空間策略,假如判斷質數:用函式判斷是否為質數相對於查詢質數表就是時間換空間的例子。
在網路傳輸時候,往往時間顯得很重要。採用本地快取的方式減少需要傳輸的資料量。
2> 稀疏資料結構。
使用指標共享大型物件,消除儲存同一物件的眾多副本的開銷
其他方法,你懂得……嘿嘿
3> 資料壓縮。
用8位的char替代 32位的int 。
利用函式將兩個十進位制數,放到一個位元組裡。加密:c= 10 * a + b; 解密:a= c / 10 ; b= c % 10;
注意 / 和 %運算子開銷較大,即執行時佔用記憶體較多。如果採用這種方法,相當於用較小的記憶體來換取儲存位元組的磁碟儲存空間。
4> 分配策略。
動態分配替代靜態分配。即只有在需要的時候才分配空間。
5> 垃圾回收。
4)程式碼空間技術
二,習題
6)加密:c= 10 * a + b; 解密:a= c / 10 ; b= c % 10;
更優化策略:
加密:c= a<<4 | b; 解密:a= c >> 4 ; b= c & 0xF;
解釋下把:c為8個位元組,一般只使用低位的四位。加密時將a提高到高四位。再與b異或,則b放到位元組底四位。解密時,將底四位的b移走得到a 。將c跟低四位為1111的數相與得到b
10)原始聲音檔案(wav)取樣率高佔用儲存空間大。在保證人耳聽不出失真情況下,降低取樣率,形成壓縮MP3的聲音格式檔案。
原始圖片檔案(raw,bmp),無失真壓縮成gif格式。有失真壓縮成jpeg
原始視訊檔案(avi:音訊視訊交錯(Audio Video Interleaved))。壓縮成(3GP,mpg)