Цель
Как кодировать данные, которые описывают, как переупорядочить статический список из одного порядка в другой порядок, используя минимальный объем данных?
У меня есть чувство, что есть алгоритм или термин компьютерной науки, который поможет мне, но прямо сейчас я слишком зациклен на проблеме, чтобы понять другие способы взглянуть на нее.
Фоновая мотивация
У меня есть программа, которая развертывается в удаленном месте, где вся связь осуществляется через прерывистое невероятно дорогое спутниковое соединение. Это небольшое преувеличение, но стоимость данных близка к доллару за килобайт и может произойти только несколько раз в день.
В начале дня пользователям присваивается список элементов, они выходят в поле и делают что-то, но конечный результат - это более или менее тот же список элементов, отсортированных в другом порядке. Там другие данные, но это не важно для этой проблемы.
Сейчас я отправляю запись всех ходов, которые происходят и воспроизводят их по порядку. По мере того как пользователи получают доступ к системе, список записей перемещений начинает приближаться к размеру просто отправки всех элементов самостоятельно, и часто некоторые комбинации ходов приводят к отмене предыдущих.
Предположения
- Начальный список и конечный список состоят из одного и того же набора элементов
- Каждый элемент имеет уникальный идентификатор (32-битное целое число)
- Каждый элемент имеет уникальный вид (32-битное целое число)
- Пользователь будет иметь список от нескольких сотен до тысячи или более элементов.
- Пользователь обычно переупорядочивает около 100 из этих элементов за один день.
- Изменения в порядке могут быть обнаружены, перемещая элемент в новую позицию в списке
- Некоторые "ходы" могут отменить предыдущие
- Ресурсы вычислений для определения оптимальных решений дешевы/неограничены
- Время передачи дорогое
- Отправка назад данных изменений дешевле, чем отправка назад всего списка.
Простейшая структура данных
В целях решения этой проблемы предполагается наличие следующих структур данных.
- ListItem
- item_id
- sort_order
- MoveRecord
- item_a_id
- new_a_position
Вот пример списка. Элементы в каждом списке одинаковы. Обратите внимание, что, хотя только некоторые из элементов были изменены, каждый идентификатор элемента имеет новый порядок сортировки, поэтому вы не можете просто отправить новые пары item_id/sort_order_id.
**List 1: Original List** **List 2: Re-ordered List**
order - id order - id
1. 10 1. 90
2. 20 2. 30
3. 30 3. 40
4. 40 4. 50
5. 50 5. 60
6. 60 6. 10
7. 70 7. 80
8. 80 8. 70
9. 90 9. 20
Как мне закодировать изменения, необходимые для преобразования порядка List 1, в список List 2, используя минимальный объем данных?
Как любопытство можно доказать, что решение является оптимальным?
Обновление
Сотрудник отметил, что "своп" может быть неправильным способом думать об этом. Вы также можете отправить элемент в верхнюю или нижнюю часть списка, что является скорее перемещением, чем свопом. Затем своп становится комбинацией двух ходов.
Спасибо за указатели. Пока я не вижу гарантированного оптимального решения. Плюс проблема просто немного изменилась.
Если я не могу доказать, что какой-либо один метод дает лучший результат, я выясню решение с использованием каждого метода и отправлю обратно это решение с небольшим заголовком, указывающим используемый метод. Продолжайте предлагать решения, хотя я и обновлю этот вопрос своими исследованиями.
Спасибо всем!