2015-09-14 66 views
0

我覺得這個問題應該可能已經在某個地方回答了,但是我一直未能找到它。我正在研究一些遺留代碼(第一份工作),並且我遇到了一個使用地圖來存儲完全23個變量的點(並且從我對該編號的理解始終不會改變)。基本上我知道地圖的訪問時間是O(1),但我總是聽說在處理地圖時存在一些開銷。在Map變得比數組更有效之前需要存儲多少項目

所以我的問題是什麼時候使用地圖變得更高效,而不是隻有一個存儲這23個值的數組。我想基本上我會在代碼中創建我自己的地圖,每當我需要存儲xValue時,我只需訪問我知道存儲xValue的數組。

地圖的開銷如此之小,以至於我在過度譴責這件事?我認爲代碼的可讀性對於地圖來說可能更容易一些,因爲使用的密鑰本質上是對xValue的描述。

+0

我不認爲地圖可以比數組更有效,因爲地圖依賴於後備數組。儘管一個數組只能和一個連續的內存片一樣大,而map_can_可以更大。 – Justin

回答

1

使用地圖(或字典)不太可能比直接數組訪問更快。也就是說,如果你知道你有N個項目,並且你知道這些項目是什麼,你可以創建一個數組和常量來表示每個項目在數組中的位置。例如(僞):

const NumItems = 22 
const ItemType1 = 0 
const ItemType2 = 1 
const ItemType3 = 2 
... 
const ItemType22 = 21 

Array myItems[22] 

然後,如果你想爲項目類型15訪問的價值,它只是myItems[ItemType15]

這種方法的缺點是您必須爲每個可能的項目之一存儲空間。所以如果你有20,000個物品而不是23個,你將不得不分配你的數組來保存所有20,000個可能的物品。並創建常量來定義每個項目類型的存儲位置。

地圖可以讓您節省空間,但會降低一些內存成本。每項開銷可能是數組每項成本的兩到三倍。但是如果你有很多可能的項目,但你一次只能打幾十個,那麼這個地圖的內存效率會更高。假設你將有20,000個項目中有30個可能。完整陣列會花費您存儲20,000個項目。這張地圖會花費你90個物品的存儲空間(30個物品陣列的三倍)。

這裏的要點是地圖交易存儲空間的速度。地圖可以存儲比數組可以更有效地整個項目的子集,但它需要更多的時間來訪問單個項目。

所以這個問題真的不是「哪個更快」,而是如果地圖提供的空間節省值得額外的處理時間。在你的情況下,如果你只有少數幾件物品中的一件,那麼使用地圖沒有任何優勢。

+0

準確地說,我正在尋找的答案,謝謝。 – Lencalot

相關問題