У нас є ряд елементів, які кінцевий користувач зможе організувати в потрібне замовлення. Набір елементів не упорядкований, але кожен елемент містить ключ сортування, який можна змінити.
Ми шукаємо алгоритм, який дозволив би створити новий ключ сортування для елементу, який додається або переміщується, або першим елементом, останнім елементом, або між будь-якими двома елементами. Ми сподіваємось лише змінити ключ сортування предмета, який переміщується.
Прикладним алгоритмом може бути, щоб кожен ключ сортування був номером з плаваючою точкою, а при розміщенні елемента між двома елементами встановити ключ сортування як їх середнє значення. Якщо розмістити елемент першим або останнім, знадобиться найбільш зовнішнє значення + - 1.
Проблема тут полягає в тому, що точність з плаваючою комою може призвести до відмови сортування. Використання двох цілих чисел для представлення дробового числа може подібним чином зробити так, щоб числа стали настільки великими, що їх неможливо було точно представити у звичайних числових типах (наприклад, при передачі як JSON). Ми не хотіли б використовувати BigInts.
Чи є для цього відповідний алгоритм, який би працював, наприклад, використовуючи рядки, на які ці недоліки не впливали б?
Ми не хочемо підтримувати величезну кількість рухів, але алгоритм, описаний вище, може вийти з ладу на подвійну точність числа плаваючих точок після приблизно 50 ходів.
A, B, C- A, AA, B, C- A, AA, AB, B, C- A, AA, AAA, AAB, AAC, AB, AC, B, C. Звичайно, ви, мабуть, хочете розмістити свої листи більше, щоб рядки не зростали так швидко, але це можна зробити.