J'ai récemment écrit du code que je pensais très inefficace, mais comme il ne comprenait que quelques valeurs, je l'ai accepté. Cependant, je suis toujours intéressé par un meilleur algorithme pour les éléments suivants:
- Une liste d'objets X, chacun d'eux se voit attribuer un "poids"
- Résumez les poids
- Générer un nombre aléatoire de 0 à la somme
- Itérer à travers les objets, en soustrayant leur poids de la somme jusqu'à ce que la somme soit non positive
- Supprimez l'objet de la liste, puis ajoutez-le à la fin de la nouvelle liste
Les éléments 2, 4 et 5 prennent tous du n
temps, et c'est donc un O(n^2)
algorithme.
Cela peut-il être amélioré?
À titre d'exemple d'un shuffle pondéré, un élément a plus de chances d'être à l'avant avec un poids plus élevé.
Exemple (je vais générer des nombres aléatoires pour le rendre réel):
6 objets de poids 6,5,4,3,2,1; La somme est 21
J'en ai choisi 19: 19-6-5-4-3-2 = -1
donc 2 va en première position, les poids sont maintenant de 6,5,4,3,1; La somme est de 19
J'en ai choisi 16 16-6-5-4-3 = -2
:, donc 3 passe en deuxième position, les poids sont maintenant de 6,5,4,1; La somme est 16
J'en ai choisi 3: 3-6 = -3
donc 6 passe en troisième position, les poids sont maintenant 5,4,1; La somme est 10
J'ai choisi 8:, 8-5-4 = -1
donc 4 va en quatrième position, les poids sont maintenant de 5,1; La somme est 6
J'ai choisi 5:, 5-5=0
donc 5 va en cinquième position, les poids sont maintenant à 1; La somme est 1
J'ai choisi 1:, 1-1=0
donc 1 va dans la dernière position, je n'ai plus de poids, je termine