У меня есть набор целых чисел, для которых я хотел бы иметь самое компактное представление. У меня есть следующие ограничения/функции:
- он установлен, или, другими словами, список уникальных целых чисел, в которых порядок не имеет значения.
- размер множества L относительно невелик (обычно 1000 элементов)
- целые числа следуют равномерному распределению между 0 и N-1, причем N относительно велико (скажем, 2 ^ 32)
- доступ к элементам сжатого набора является случайным, но это нормально, если процедура декомпрессии не так быстро
- сжатие должно быть без потерь, очевидно
Я пробовал несколько вещей, но результаты не удовлетворены, и я как-то убежден, что существует лучшее решение:
- дельта-кодирование (сортировка, затем различие в кодировке) или сортировка, а затем кодирование различий между i-м элементом и я * N/L. Оба дают разумные результаты, но не велики, вероятно, из-за типичных размеров кодирования N и L. Huffman, дельта не помогает, потому что они обычно большие.
- рекурсивное уменьшение диапазона (http://ygdes.com/ddj-3r/ddj-3r_compact.html). Это кажется умным, но лучше всего работает с экспоненциально уменьшающимися целыми числами, что определенно не так.
- несколько обсуждений здесь о stackoverflow похожи, но не полностью эквивалентны моей проблеме (C Library для сжатия последовательных положительных целых чисел, Сжатие отсортированных целых чисел)
Я был бы рад услышать любые твои идеи. Спасибо заранее!
UPDATE:
Оказывается, что дельта-кодирование приближается к оптимальному решению. Это может быть другим для других распределений элементов в наборе.