Ich habe kürzlich einen Code geschrieben, den ich für sehr ineffizient hielt, aber da er nur wenige Werte enthielt, habe ich ihn akzeptiert. Ich bin jedoch immer noch an einem besseren Algorithmus für Folgendes interessiert:
- Eine Liste von X Objekten, denen jeweils ein "Gewicht" zugewiesen wurde
- Fasse die Gewichte zusammen
- Generiere eine Zufallszahl von 0 bis zur Summe
- Durchlaufen Sie die Objekte und subtrahieren Sie deren Gewicht von der Summe, bis die Summe nicht mehr positiv ist
- Entfernen Sie das Objekt aus der Liste und fügen Sie es am Ende der neuen Liste hinzu
Die Punkte 2, 4 und 5 brauchen alle n
Zeit, und so handelt es sich um einen O(n^2)
Algorithmus.
Kann das verbessert werden?
Als Beispiel für ein gewichtetes Shuffle hat ein Element eine größere Chance, mit einem höheren Gewicht vorne zu stehen.
Beispiel (Ich werde Zufallszahlen generieren, um es real zu machen):
6 Objekte mit Gewichten 6,5,4,3,2,1; Die Summe ist 21
Ich wählte 19 19-6-5-4-3-2 = -1
:, also 2 geht in die erste Position, Gewichte sind jetzt 6,5,4,3,1; Die Summe ist 19
Ich wählte 16 16-6-5-4-3 = -2
:, also 3 geht in die zweite Position, Gewichte sind jetzt 6,5,4,1; Die Summe ist 16
Ich wählte 3 3-6 = -3
:, also 6 geht in die dritte Position, Gewichte sind jetzt 5,4,1; Die Summe ist 10
Ich wählte 8:, 8-5-4 = -1
also 4 geht in die vierte Position, Gewichte sind jetzt 5,1; Die Summe ist 6
Ich wählte 5:, 5-5=0
also 5 geht in die fünfte Position, Gewichte sind jetzt 1; Die Summe ist 1
Ich habe 1: gewählt 1-1=0
, also 1 geht in die letzte Position, ich habe keine Gewichte mehr, ich beende