На самом деле, вы можете сделать ОЧЕНЬ лучше, чем 2,5 МБ, так как не все заказы возможны. Можно утверждать, что избиение 5% будет включать сжатие, поскольку не хранится сама последовательность. По сути, вы хотели бы сохранить канонический порядковый номер. 8 чисел из 0-7 в случайном порядке обычно занимают 24 бита (log(8^8)/log(2)
), но с каноническим порядковым номером это займет 16 бит (log(8!)/log(2)
).
По сути, это предполагает создание алгоритма, который может преобразовать любую последовательность целых чисел в гигантское число. Примером возможной нумерации для последовательности из 8 чисел будет упорядочение по значению:
01234567 : 0
01234576 : 1
01234657 : 2
01234675 : 3
01234756 : 4
01234765 : 5
...
Стоимость этой стратегии log(1000000!)/log(2)
(т. Е. log_2(1000000!)
).
Стандартное решение обычно стоит около log(1000000^1000000)/log(2)
.
Вы также можете сжать немного больше места, обрабатывая 0000 0000 1111 1111
и 1111 1111
по-разному, но объем сэкономленного пространства невероятно мал.
Редактировать: Быстрое и грязное вычисление указывает, что эта оптимизация снижает размер примерно до 2,204 МБ.
Из-за принципа голубиных ям, я не верю, что можно добиться большего успеха, чем эта стратегия, независимо от того, используете ли вы сжатие или какую-то другую технику.