Mamy wiele elementów, które użytkownik końcowy będzie mógł uporządkować w pożądanym porządku. Zestaw elementów jest nieuporządkowany, ale każdy element zawiera klucz sortowania, który można modyfikować.
Szukamy algorytmu, który pozwoliłby wygenerować nowy klucz sortowania dla elementu, który jest dodawany lub przenoszony jako pierwszy element, ostatni element lub pomiędzy dowolnymi dwoma elementami. Mamy nadzieję, że będziemy musieli jedynie zmodyfikować klucz sortowania przenoszonego elementu.
Przykładowym algorytmem byłoby, aby każdy klucz sortowania był liczbą zmiennoprzecinkową, a umieszczając element między dwoma elementami, ustaw klucz sortowania na ich średnią. Umieszczenie przedmiotu na pierwszym lub ostatnim miejscu przyjąłoby najwyższą wartość + - 1.
Problem polega na tym, że precyzja zmiennoprzecinkowa może spowodować niepowodzenie sortowania. Użycie dwóch liczb całkowitych do przedstawienia liczby ułamkowej może również spowodować, że liczby staną się tak duże, że nie będą mogły być dokładnie przedstawione w zwykłych typach liczbowych (np. Podczas przesyłania jako JSON). Nie chcielibyśmy używać BigInts.
Czy istnieje odpowiedni algorytm, który działałby na przykład przy użyciu ciągów, na które te niedociągnięcia nie miałyby wpływu?
Nie chcemy obsługiwać dużej liczby ruchów, ale algorytm opisany powyżej może zawieść na liczbach zmiennoprzecinkowych podwójnej precyzji po około 50 ruchach.
A, B, C
- A, AA, B, C
- A, AA, AB, B, C
- A, AA, AAA, AAB, AAC, AB, AC, B, C
. Oczywiście, prawdopodobnie chciałbyś rozłożyć litery bardziej, aby ciągi nie rosły tak szybko, ale można to zrobić.