2012-09-27 29 views
10

(大約有時效性的稀疏矩陣的一些問題,但我正在尋找存儲效率。)內存效率稀疏數組中的Java

我需要一個List<T>相當於或Map<Integer,T>

  1. 只需設置大於以前遇到的任何一個密鑰,就可以按需增長。 (可以假設鍵爲非負。)
  2. 大約是內存效率作爲ArrayList<T>中,大部分的指數不null的情況下,即,當實際數據不是很稀疏。
  3. 當索引稀疏時,消耗的空間與非索引的數量成正比。
  4. 使用比HashMap<Integer,T>更少的內存(因爲這autoboxes鍵和可能不利用Scalar密鑰類型)。
  5. 可以獲得或設置一個元素在分期付款日誌(N)時間,其中N是條目數量:不需要是線性時間,二進制搜索是可以接受的。
  6. 在非開源的純Java庫(最好在Maven Central中)實現。

有誰知道這樣一個工具類的?

我本來期望Commons Collections中有一個,但它似乎沒有。

我碰到了org.apache.commons.math.util.OpenIntToFieldHashMap這看起來幾乎是正確的,除了值類型是FieldElement這似乎是無償的;我只想要T extends Object。它看起來很容易將其源代碼編輯爲更通用,但我寧願使用二進制依賴關係(如果有)。

回答

6

我會嘗試用trove收藏,有TIntObjectMap它可以爲您的意圖工作。

+0

看起來不錯。我嘗試將'OpenIntToFieldHashMap'修改爲一個通用的值類型,這似乎適用於〜10分鐘的工作,但它只比'TIntObjectMap'稍微好一些。 –

1

我救了我的測試情況下jglick/inthashmap。結果:

HashMap size: 1017504 
TIntObjectMap size: 853216 
IntHashMap size: 846984 
OpenIntObjectHashMap size: 760472 
+1

我在哪裏可以找到IntHashMap? – oleh

+0

@oleh可能是apache commons(?) – Karussell

+1

對不起,'IntHashMap'是我對Commons Math中的'OpenIntToFieldHashMap'的改編。由於它比'TIntObjectMap'要好,所以我放棄了這種方法。 –

4

我會看看Android的SparseArray實現的靈感。您可以通過此處下載AOSP的源代碼來查看源代碼http://source.android.com/source/downloading.html

+0

https://code.google.com/p/android-source-browsing/source/browse/core/java/android/util/SparseArray.java?spec=svn.platform--frameworks--base.58aff7debfdab8ca99dd6bfcfa0c7bebdf2d303b&repo=platform --frameworks - base&r = 58aff7debfdab8ca99dd6bfcfa0c7bebdf2d303b確實看起來合適 - 分期運行時間沒有記錄,但從檢查中我猜測它是對數 - 並且在ASL 2.0下,這很好。不幸的是,它並不在我知道的Central中,並且希望它能夠與Android藍牙支持等無關的東西分離開來,這些支持都在同一個源代碼根目錄中。 –

+1

下面是一個使用所有必要的代碼的Android https://github.com/frostwire/frostwire-jlibtorrent/blob/b4b3f9a90d7a1dade864d7e3eaa88b616f200a9a/src/com/frostwire/jlibtorrent/SparseArray.java – Gubatron

1

我會建議您使用Colt庫中的OpenIntObjectHashMap。 Link

+0

謝謝你的提示一個自包含的版本。它確實比替代品具有適度但明顯更低的空間消耗。我在我修改過的測試用例中加入了這個。 –