Скажем, у вас есть List<List<Boolean>>
, и вы хотите его кодировать в двоичную форму самым компактным способом.
Мне не нравится производительность чтения или записи. Я просто хочу использовать минимальное пространство. Кроме того, пример представлен на Java, но мы не ограничиваемся только системой Java. Длина каждого "списка" неограничена. Поэтому любое решение, которое кодирует длину каждого списка, должно само кодировать тип данных переменной длины.
К этой проблеме относится кодирование целых чисел переменной длины. Вы можете представить каждый List<Boolean>
как переменную длину unsigned integer
.
Пожалуйста, внимательно прочитайте вопрос. Мы не ограничены системой Java.
ИЗМЕНИТЬ
Я не понимаю, почему многие ответы говорят о сжатии. Я не пытаюсь сделать сжатие как таковое, а просто кодирование случайной последовательности бит вниз. За исключением того, что каждая последовательность бит имеет разную длину, и порядок должен быть сохранен.
Вы можете думать об этом вопросе по-другому. Допустим, у вас есть список произвольного списка случайных целых без знака (неограниченный). Как вы кодируете этот список в двоичном файле?
Исследование
Я прочитал немного и нашел то, что я действительно ищу, Универсальный код
Результат
Я собираюсь использовать вариант Elias Omega Coding, описанный в статье Новый рекурсивный универсальный код положительных целых чисел
Теперь я понимаю, чем меньше представление меньших целых чисел является компромиссом с большими целыми числами. Просто выбрав универсальный код с "большим" представлением самого первого целого, вы сохраняете много места в конечном счете, когда вам нужно кодировать произвольные большие целые числа.