Просто чтобы не изобретать горячую воду, прошу здесь ...
У меня есть приложение с большим количеством массивов, и ему не хватает памяти.
Таким образом, идея состоит в том, чтобы сжать List<int>
до чего-то другого, что бы имело тот же интерфейс (например, IList<T>
), но вместо int
я мог бы использовать более короткие целые числа.
Например, если мой диапазон значений 0 - 100.000.000, мне нужно только ln2 (1000000) = 20 бит. Таким образом, вместо хранения 32 бит, я могу обрезать излишки и уменьшить требования к памяти на 12/32 = 37,5%.
Вам известна реализация такого массива. С ++ и java тоже подойдут, так как я могу легко конвертировать их в c #.
Дополнительные требования (поскольку все начинают понимать меня):
- целых чисел в списке являются уникальными
- они не имеют специальных свойств, поэтому они не сжимаются никаким другим способом, кроме уменьшения количества бит
- если диапазон значений равен одному миллиону, например, списки будут иметь размер от 2 до 1000 элементов, но их будет много, поэтому BitSets не будет
- новый контейнер данных должен вести себя как массив большого размера (в отношении метода O () - ness)
EDIT:
Пожалуйста, не говорите мне НЕ делать это. Требование для этого хорошо продумано, и это ЕДИНСТВЕННЫЙ оставленный вариант.
Кроме того, 1М диапазона значений и 20 бит для него - ТОЛЬКО ПРИМЕР. У меня есть дела со всеми различными диапазонами и целочисленными размерами.
Кроме того, я мог бы иметь еще более короткие целые числа, например 7-битные целые, тогда упаковка была бы
00000001
11111122
22222333
33334444
444.....
для первых 4 элементов, упакованных в 5 байтов.
Почти готов кодирование - скоро будет опубликовано ...