2017-08-28 20 views
1

在Java中,具有稀疏內容的大型二維數組的內存效率較低,因爲它佔用了連續的內存塊,而不管實際上存儲了哪些數據。對於稀疏Java 2D數組,什麼是內存意識替代方案?

我正在尋找一種替代數據結構,可以以位置,網格狀的方式保存元素。我最好將存儲效率設爲O(n),其中n是實際在結構中的數據元素的數量。

乾杯!

+2

怎麼樣的地圖,其關鍵是用一對索引的POJO? (如果你需要返回整行,這可能不是最好的,但如果你所做的只是訪問單個元素,它應該可以正常工作。) – ajb

+0

this? https://stackoverflow.com/questions/45829943/how-to-efficiently-store-small-byte-arrays-in-java我想最近這是討論 – Eugene

+1

如果你不想實現一個新的類您可以使用「A_B」形式的字符串,其中A是第一維的索引,B是第二維的索引。 – bhspencer

回答

2

如果你想線性範圍訪問(所有X給我伊蘇的範圍內),那麼用樹來實現的容器可能仍然工作正常嘗試地圖或元組的詞典(X,Y)

。散列表對於隨機訪問是很好的。

也可以嘗試SparseArray

不管你選擇,確保:

  1. 瞭解底層實現,雖然它可能會 隨着時間的推移而改變。
  2. 衡量和比較

通常測量節拍理論化

+0

您建議使用哪個特定的具體課程作爲鑰匙?你是否建議OP爲它們的鍵創建一個新的Tuple類並實現hashCode()? – bhspencer

+0

@bhspencer可以使用'Map.Entry ',儘管爲這樣的東西創建一個新類型絕對不是聞所未聞的,看到Java如何缺少'Pair'類型 –

+0

對於簡單的實現,您還可以使用'String'格式爲「X:Y」(例如) – vikingsteve

2

您可以使用HashMap,其中鍵包含X和Y位置。如果你不想爲Map實現一個新的類,你可以使用一個形式爲「X_Y」的字符串,其中X是第一維的索引,Y是第二維的索引。

Map<String, YourClass> map = new HashMap<>(); 

爲了把一個項目在位置2345,6789,你可以這樣做:

map.put(2345 + "_" + 6789, yourObject); 

而且把它找回來:

YourClass yourObject = map.get(2345 + "_" + 6789); 

爲什麼選擇這種方法比使用某種Tuple的?我認爲最簡單的答案是Java不帶Tuple或Pair類。你可以編寫自己的代碼並添加你自己的hashCode()和equals()實現,或者你可以使用類似Map.Entry<K, V>的東西。無論您是爲密鑰選擇一個字符串還是爲密鑰選擇一個類,都不會對執行時間產生重大影響。通過使用字符串可以減少某些類型的安全性,並用一些簡短的代碼彌補了這一點。

+1

這會在您每次向地圖添加新條目時創建新的'StringBuilder',發現「鄰居」條目還需要解析導致更多'String'對象的鍵,並且缺乏類型安全性 - 爲什麼使用'String'這個? –

+0

Java String literal concatenation是否真的在幕後創建了一個StringBuilder?這似乎不太可能。我建議使用簡單的字符串文字,因爲它比使用hashCode()和equals()實現自我的其他類的工作少得多。 – bhspencer

+0

這個答案表明一個StringBuilder不用於字符串字面串聯https://stackoverflow.com/questions/1532461/stringbuilder-vs-string-concatenation-in-tostring-in-java – bhspencer