Сжатая реализация SortedSet <Long> - PullRequest
2 голосов
/ 05 сентября 2011

Мне нужно хранить большое количество Long значений в SortedSet реализации с минимальным использованием пространства. Я рассматривал реализации битового набора и обнаружил Javaewah . Однако API ожидает int значений, а не long с.

Кто-нибудь может порекомендовать какие-либо альтернативы или предложить хороший способ решения этой проблемы? В основном меня интересует космическая эффективность. При создании набора мне нужно будет получить доступ к минимальному и максимальному элементу один раз. Однако время доступа не является серьезной проблемой (т. Е. Будет вполне приемлема кодированная реализация с полной длиной выполнения).

EDIT

Мне должно быть ясно, что реализация не должна реализовывать интерфейс SortedSet, если я могу получить доступ к минимальному и максимальному элементам коллекции.

Ответы [ 2 ]

1 голос
/ 05 сентября 2011

Вы можете использовать TLongArrayList, который использует long[] внизу. Он поддерживает sort(), поэтому min и max будут первым и последним значением.

Или вы можете использовать long[] с длиной и сделать это самостоятельно. ;)

Это будет использовать примерно на 64 байта больше, чем сами исходные значения. Вы можете стать более компактными, если сделаете некоторые предположения о диапазоне длинных значений. например если они на самом деле ограничены 48-разрядным.

Вы можете рассмотреть возможность использования LongBuffer. Если он отображен в память, он избегает использования кучи или прямой памяти, но вам бы пришлось реализовать процедуру сортировки самостоятельно.


Если они сгруппированы, вы можете представлять данные в виде набора диапазонов. Диапазоны могут быть чистыми A - B или BitSet с начальным значением. Последний работает хорошо для телефонных номеров. ;)

1 голос
/ 05 сентября 2011

Не уверен, имеет ли он Set или насколько он эффективен по сравнению с обычным JCF, но взгляните на это:

http://commons.apache.org/primitives/

...