Temos vários itens que o usuário final poderá organizar em um pedido desejado. O conjunto de itens não é ordenado, mas cada item contém uma chave de classificação que pode ser modificada.
Estamos procurando um algoritmo que permita gerar uma nova chave de classificação para um item que é adicionado ou movido para ser o primeiro, o último ou entre dois itens. Esperamos ter apenas que modificar a chave de classificação do item que está sendo movido.
Um algoritmo de exemplo seria fazer com que cada chave de classificação fosse um número de ponto flutuante e, ao colocar um item entre dois itens, defina a chave de classificação como sua média. A colocação de um item primeiro ou último levaria o valor mais externo + - 1.
O problema aqui é que a precisão do ponto flutuante pode causar falha na classificação. Usar dois números inteiros para representar um número fracionário pode fazer com que os números se tornem tão grandes que não possam ser representados com precisão em tipos numéricos regulares (por exemplo, ao transferir como JSON). Não gostaríamos de usar BigInts.
Existe um algoritmo adequado para isso que funcionaria, por exemplo, usando seqüências de caracteres, que não seriam afetadas por essas deficiências?
Não queremos oferecer suporte a um grande número de movimentos, mas o algoritmo descrito acima pode falhar em um número de pontos flutuantes de precisão dupla após cerca de 50 movimentos.
A, B, C
- A, AA, B, C
- A, AA, AB, B, C
- A, AA, AAA, AAB, AAC, AB, AC, B, C
. Obviamente, você provavelmente desejaria espaçar suas cartas mais para que as cordas não crescessem tão rapidamente, mas isso pode ser feito.