Nous avons un certain nombre d'articles que l'utilisateur final pourra organiser dans une commande souhaitée. L'ensemble des éléments n'est pas ordonné, mais chaque élément contient une clé de tri qui peut être modifiée.
Nous recherchons un algorithme qui permettrait de générer une nouvelle clé de tri pour un élément ajouté ou déplacé pour être le premier élément, le dernier élément ou entre deux éléments. Nous espérons avoir seulement à modifier la clé de tri de l'élément déplacé.
Un exemple d'algorithme serait que chaque clé de tri soit un nombre à virgule flottante, et lorsque vous placez un élément entre deux éléments, définissez la clé de tri sur leur moyenne. Placer un élément en premier ou en dernier prendrait la valeur la plus externe + - 1.
Le problème ici est que la précision en virgule flottante peut entraîner l'échec du tri. L'utilisation de deux nombres entiers pour représenter un nombre fractionnaire pourrait également faire en sorte que les nombres deviennent si grands qu'ils ne pourraient pas être représentés avec précision dans les types numériques réguliers (par exemple lors du transfert en JSON). Nous ne voudrions pas utiliser BigInts.
Existe-t-il un algorithme approprié pour cela qui fonctionnerait, par exemple, en utilisant des chaînes, qui ne seraient pas affectées par ces défauts?
Nous ne cherchons pas à prendre en charge un grand nombre de mouvements, mais l'algorithme décrit ci-dessus pourrait échouer sur un nombre à virgule flottante double précision après environ 50 mouvements.
A, B, C
- A, AA, B, C
- A, AA, AB, B, C
- A, AA, AAA, AAB, AAC, AB, AC, B, C
. Bien sûr, vous voudrez probablement espacer davantage vos lettres afin que les chaînes ne se développent pas si rapidement, mais cela peut être fait.