《程式設計珠璣》程式碼之路15:節省空間的常見姿勢
1:地理資訊庫中儲存鄰居的系統
地理資訊庫中的鄰居用一個點(x, y)表示,x和y在[0,199]取值,假設一共有兩千個,那麼可以用一個200*200的二位格子矩陣表示,還可以作成圖形介面,使用者點選那個格子,系統把點選訊號轉化成對應的x和y,就可以直接訪問相應鄰居,如下圖所示,格子為空表示空值,否則為相應資料。
法一:我們可以直接用一個二維陣列實現,這樣訪問起來也非常方便,但問題中也就只有2000個鄰居,而200*200=40000,也就是說只有5%左右的儲存空間可以得到利用,從空間上來說,浪費非常大。
法二:可以用下圖所示的資料結構來實現:
最左邊的colhead陣列,下標對應法一二維陣列中的列號,每個元素都是一個連結串列的頭指標。每個連結串列節點有兩個成員,分別是對應的行號和資料。這樣可以在常數時間找到對應的列,線上性時間找到對應的行號,然後取出需要的資料。通常來說,這個空間效能已經很不錯的,但還沒有優化到極致。
算一下哈:除了一個連結串列頭陣列,每個元素還需要一個指標和一個儲存行號的空間,最重要的是,結構體在分配空間的時候還會因為對齊等問題造成空間浪費。
法三:開闢三個陣列解決問題,第一個firstincol陣列,下標對應列號,下標對應的數值代表這一列元素在陣列row的第一個位置。陣列row代表對應元素的行號。例如firstincol[0]值為0,代表第0列第一個元素在row[0],對應的pointnum[0]就是相應的數值,不難發現,根據firstincol[0 + 1]就可以找到firstincol[0]最後一個元素的位置。
如此一來,一個鄰居只需要兩個int來解決問題,而且不會因為結構體動態分配問題浪費更多空間。
當然,因為下標都在200以內,所以int其實可以替換為char,進一步節省空間。
相關文章
- 《程式設計珠璣》程式碼之路13:陣列如何線上性時間內實現多次區間修改程式設計陣列
- 《程式設計珠璣》程式碼之路11:最大子陣列和問題,花式七種解法程式設計陣列
- 《程式設計珠璣》程式碼之路12:如何用C/C++實現array[-1]並利用它寫出優美的程式碼程式設計C++
- 《程式設計珠璣》程式碼之路14:兩個不會演算法也能把效率提升4倍的小套路程式設計演算法
- 程式設計師在家擼碼的十大姿勢程式設計師
- 趕緊收藏!程式設計師必備的工具網站,用好了節省你大把的程式設計時間程式設計師網站
- 常見的Web安全及其攻防姿勢Web
- Python - 使用__slots__節省空間Python
- 程式碼除錯的N種姿勢除錯
- 【Linux網路程式設計】網路程式設計常見概念Linux程式設計
- 程式設計師玩連連看的正確姿勢程式設計師
- OC/Swift/C/C++混合使用的程式設計姿勢SwiftC++程式設計
- 關於Web安全常見的攻防姿勢Web
- iOS面試珠璣iOS面試
- 程式碼規範設定常見英文
- Powershell惡意程式碼的N種姿勢
- Git Bash 提交程式碼的正確姿勢Git
- 盤點Linux常見的程式碼統計工具!Linux
- 屬於每個程式設計師的節日,1024程式設計師節程式碼敲響世界程式設計師
- 1024程式設計師節,向用程式碼改變世界的程式設計師致敬!程式設計師
- C語言程式設計-現代方法 第二版 第2.5小節程式碼 計算箱子的空間重量改進版C語言程式設計
- 我的程式設計之路程式設計
- uni微信小程式優化,幾行程式碼就能省100kb的主包空間?微信小程式優化行程
- Python程式設計常見問題與解答Python程式設計
- 翻譯 | 新手開始學習程式設計的正確姿勢程式設計
- 分享 程式碼大全 節選 -- 程式設計師的習慣程式設計師
- Python 儲存字串時是如何節省空間的?Python字串
- 關於6種Web安全常見的攻防姿勢Web
- 你見過背誦程式碼的程式設計師嗎?程式設計師
- 好程式設計師Python培訓分享Python程式設計中常見的異常處理程式設計師Python
- 程式設計師必知必會:MySQL上15個常見SQL最佳化技巧程式設計師MySql
- 程式設計師須知,Python匯入模組的幾種姿勢!程式設計師Python
- 感悟我的程式設計之路程式設計
- 我的程式設計師之路程式設計師
- Linux網路程式設計常見面試題Linux程式設計面試題
- Rust學習之旅2——常見程式設計概念Rust程式設計
- Java程式設計師面試常見問題Java程式設計師面試
- redis入門指南(四)—— redis如何節省空間Redis