Recentemente, escrevi um código que considerava muito ineficiente, mas como ele incluía apenas alguns valores, aceitei. No entanto, ainda estou interessado em um algoritmo melhor para o seguinte:
- Uma lista de objetos X, a cada um deles é atribuído um "peso"
- Resuma os pesos
- Gere um número aleatório de 0 à soma
- Iterar através dos objetos, subtraindo seu peso da soma até que a soma não seja positiva
- Remova o objeto da lista e adicione-o ao final da nova lista
Os itens 2,4 e 5 levam n
tempo e, portanto, é um O(n^2)
algoritmo.
Isso pode ser melhorado?
Como exemplo de uma reprodução aleatória ponderada, um elemento tem uma chance maior de estar na frente com um peso maior.
Exemplo (gerarei números aleatórios para torná-lo real):
6 objetos com pesos 6,5,4,3,2,1; Soma é 21
Escolhi 19: 19-6-5-4-3-2 = -1
assim, 2 vai na primeira posição, os pesos agora são 6,5,4,3,1; Soma é 19
Escolhi 16: 16-6-5-4-3 = -2
assim, 3 vai para a segunda posição, agora os pesos são 6,5,4,1; Soma é 16
Escolhi 3: 3-6 = -3
assim 6 passa para a terceira posição, agora os pesos são 5,4,1; Soma é 10
Escolhi 8: 8-5-4 = -1
assim, 4 vai para a quarta posição, os pesos agora são 5,1; Soma é 6
Escolhi 5: 5-5=0
assim 5 passa para a quinta posição, os pesos agora são 1; Soma é 1
Escolhi 1:, 1-1=0
assim, 1 vai para a última posição, não tenho mais pesos, termino