Подтвердить что ты не робот

Эффективный разреженный массив в Java

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

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

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

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

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

Я столкнулся с org.apache.commons.math.util.OpenIntToFieldHashMap, который выглядит почти правильно, за исключением типа значения FieldElement, который кажется безвозмездным; Я просто хочу T extends Object. Похоже, что его исходный код будет легко редактировать более общим, хотя я бы предпочел использовать бинарную зависимость, если она доступна.

4b9b3361

Ответ 1

Я бы постарался с trove коллекциями, TIntObjectMap, который может работать для ваших целей.

Ответ 2

Я бы посмотрел на реализацию Android SparseArray для вдохновения. Вы можете просмотреть исходный код, загрузив исходный код AOSP здесь http://source.android.com/source/downloading.html

Ответ 3

Я сохранил свой тестовый пример как jglick/inthashmap. Результаты:

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

Ответ 4

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