《程式設計珠璣》程式碼之路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:最大子陣列和問題,花式七種解法程式設計陣列
- 《程式設計珠璣》第二章-迴圈移位程式設計
- 《程式設計珠璣》第2章三個問題程式設計
- 《程式設計珠璣》程式碼之路12:如何用C/C++實現array[-1]並利用它寫出優美的程式碼程式設計C++
- 《程式設計珠璣》程式碼之路14:兩個不會演算法也能把效率提升4倍的小套路程式設計演算法
- 《程式設計珠璣》第一章-點陣圖排序程式設計排序
- iOS面試珠璣iOS面試
- 程式設計師在家擼碼的十大姿勢程式設計師
- 一本書到底有幾個版本?——《程式設計珠璣》和《重構》程式設計
- 常見的Web安全及其攻防姿勢Web
- 反射空間程式設計反射程式設計
- 關於Web安全常見的攻防姿勢Web
- 趕緊收藏!程式設計師必備的工具網站,用好了節省你大把的程式設計時間程式設計師網站
- 程式碼除錯的N種姿勢除錯
- 表空間常見的操作
- JavaScript 設計模式 :正確使用物件導向程式設計的姿勢JavaScript設計模式物件程式設計
- [心得] Linux使用技巧珠璣Linux
- 程式設計師玩連連看的正確姿勢程式設計師
- OC/Swift/C/C++混合使用的程式設計姿勢SwiftC++程式設計
- Python 開發者面向文件程式設計的正確姿勢Python程式設計
- 趣圖:和程式設計師交流的正確姿勢程式設計師
- PCL常見程式設計問題程式設計
- Python - 使用__slots__節省空間Python
- Powershell惡意程式碼的N種姿勢
- Git Bash 提交程式碼的正確姿勢Git
- 15個熱門的程式設計趨勢及15個逐步走向衰落的程式設計方向程式設計
- 程式碼規範設定常見英文
- 關於6種Web安全常見的攻防姿勢Web
- 【Linux網路程式設計】網路程式設計常見概念Linux程式設計
- UIWebView程式碼注入時機與姿勢UIWebView
- JS常見的小程式碼JS
- 如何節省windows 7系統硬碟空間Windows硬碟
- 程式設計師該用哪種姿勢來理財程式設計師