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

131
9

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


Мне нужен эквивалент 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. Похоже, что его исходный код будет легко редактировать более общим, хотя я бы предпочел использовать бинарную зависимость, если она доступна.

спросил(а) 2012-09-27T19:39:00+04:00 7 лет, 12 месяцев назад
1
Решение
105

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

ответил(а) 2012-09-27T19:49:00+04:00 7 лет, 12 месяцев назад
91

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

ответил(а) 2013-04-22T06:50:00+04:00 7 лет, 5 месяцев назад
57

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

ответил(а) 2014-05-13T22:30:00+04:00 6 лет, 4 месяца назад
59

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


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

ответил(а) 2012-09-27T20:08:00+04:00 7 лет, 12 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема