Цель
Как закодировать данные, которые описывают, как переупорядочить статический список от одного порядка до другого порядка с помощью минимального количества возможных байтов?
Исходная мотивация
Первоначально эта проблема возникла при работе над проблемой, передающей данные датчика с помощью дорогой спутниковой связи. Устройство имело список приблизительно 1 000 датчиков, которые они контролировали. Список датчика не мог измениться. Каждый датчик имел уникальный идентификатор. Все данные регистрировались внутренне для возможного анализа, единственная вещь, что необходимые конечные пользователи ежедневно были который датчик, запущенный в который порядок.
Весь проект был фрагментирован, но эта проблема кажется слишком интересной для игнорирования. Также ранее я говорил о "подкачках", потому что я думал об алгоритме сортировки, но действительно это - полный порядок, это важно, шаги, требуемые достигать того порядка, вероятно, не имели бы значения.
Как данные были заказаны
В терминах SQL Вы могли думать о нем как это.
**Initial Load**
create table sensor ( id int, last_detected datetime, other stuff )
-- fill table with ids of all sensors for this location
Day 0: Select ID from Sensor order by id
(initially data is sorted by the sensor.id because its a known value)
Day 1: Select ID from Sensor order by last_detected
Day 2: Select ID from Sensor order by last_detected
Day 3: Select ID from Sensor order by last_detected
Предположения
Поскольку я сказал, что проект/аппаратные средства больше не, это - теперь просто академическая проблема.
Проблема!
Определите кодер
Определите декодер
Весело проведите время все.
Как в качестве академической проблемы, один подход будет смотреть на алгоритм P раздел 3.3.2 VOL II из искусства компьютерного программирования Knuth, который отображает каждую перестановку на N объекты в целое число между 0 и N! -1. Если вся возможная перестановка одинаково вероятно, в любое время, то лучшее, что вы можете сделать, это вычислить и передавать это (многоточное) целое число. На практике дает каждому датчику 10-битное число, а затем упаковывать эти 10 битных чисел, поэтому у вас есть E.G. 4 числа, упакованные в каждую кусок 5 байтов.
Схемы, основанные на Diff или Off Сжатие полки, используют знание, что не все перестановки одинаково вероятны. Возможно, вы знаете об этом на основе оборудования, или вы можете увидеть, является ли это случай, посмотрев на предыдущие данные. Хорошо, если это работает. В некоторых случаях с датчиками и спутниками вы можете захотеть беспокоиться о редких исключениях, где вы получаете худшее поведение вашей схемы сжатия, и у вас вдруг есть больше данных для передачи, чем вам.