2012-09-27 3 views
10

(Есть несколько вопросов о время эффективного разреженных массивов, но я ищу для эффективности использования памяти.)памяти эффективного разреженный массив в Java

мне нужен эквивалент List<T> или Map<Integer,T>, которые

  1. Может расти по требованию, просто устанавливая ключ, который больше, чем любой, с которым мы столкнулись раньше. (Может считаться, что ключи неотрицательны.)
  2. Является примерно такой же эффективной для памяти, как и ArrayList<T>, в случае, если большинство индексов не являются null, то есть когда фактические данные не очень разрежены.
  3. Когда индексы разрежены, потребляет пространство, пропорциональное числу индексов не null.
  4. Использует меньше памяти, чем HashMap<Integer,T> (так как это автоблокирует ключи и, вероятно, не использует тип скалярного ключа).
  5. Может получить или установить элемент в амортизированном журнале (N), где N - количество записей: не обязательно должно быть линейное время, бинарный поиск будет приемлемым.
  6. Реализована в невирусной чистой Java-библиотеке с открытым исходным кодом (желательно в Maven Central).

Кто-нибудь знает о таком классе полезности?

Я бы ожидал, что коллекций Commons будет один, но это не похоже.

Я столкнулся с 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' был моей адаптацией' OpenIntToFieldHashMap' из Commons Math. Поскольку это было едва лучше, чем '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, и это нормально. К сожалению, это не в Центральной, о которой я знаю, и хотел бы, чтобы она была отделена от несвязанных вещей, таких как поддержка Android Bluetooth, которая находится в том же корневом источнике. –

+1

Вот самодостаточная версия, которая использует весь необходимый код от андроида https://github.com/frostwire/frostwire-jlibtorrent/blob/b4b3f9a90d7a1dade864d7e3eaa88b616f200a9a/src/com/frostwire/jlibtorrent/SparseArray.java – Gubatron

1

Я предлагаю вам использовать OpenIntObjectHashMap из библиотеки Colt. Link

+0

Спасибо за отзыв , Это действительно имеет умеренное, но значительно меньшее потребление пространства, чем альтернативы. Я включил это в свой пересмотренный тестовый пример. –

 Смежные вопросы

  • Нет связанных вопросов^_^