Di recente ho scritto del codice che ho ritenuto molto inefficiente, ma poiché includeva solo pochi valori, l'ho accettato. Tuttavia, sono ancora interessato a un algoritmo migliore per quanto segue:
- Un elenco di oggetti X, a ciascuno di essi viene assegnato un "peso"
- Riassumi i pesi
- Genera un numero casuale da 0 alla somma
- Scorrere gli oggetti, sottraendo il loro peso dalla somma fino a quando la somma non è positiva
- Rimuovere l'oggetto dall'elenco e quindi aggiungerlo alla fine del nuovo elenco
Gli articoli 2,4 e 5 richiedono tutti del n
tempo, quindi è un O(n^2)
algoritmo.
Questo può essere migliorato?
Come esempio di shuffle ponderato, un elemento ha maggiori possibilità di trovarsi davanti con un peso maggiore.
Esempio (genererò numeri casuali per renderlo reale):
6 oggetti con pesi 6,5,4,3,2,1; La somma è 21
Ho scelto 19 19-6-5-4-3-2 = -1
:, quindi 2 va in prima posizione, i pesi ora sono 6,5,4,3,1; La somma è 19
Ho scelto 16 16-6-5-4-3 = -2
:, quindi 3 va in seconda posizione, i pesi ora sono 6,5,4,1; La somma è 16
Ho scelto 3 3-6 = -3
:, quindi 6 va in terza posizione, i pesi ora sono 5,4,1; La somma è 10
Ho scelto 8:, 8-5-4 = -1
quindi 4 va in quarta posizione, i pesi ora sono 5,1; La somma è 6
Ho scelto 5:, 5-5=0
quindi 5 va in quinta posizione, i pesi ora sono 1; La somma è 1
Ho scelto 1:, 1-1=0
quindi 1 va nell'ultima posizione, non ho più pesi, finisco