Recentemente ho scritto un codice che ritenevo molto inefficiente, ma poiché includeva solo alcuni 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
- Fai scorrere gli oggetti, sottraendo il loro peso dalla somma fino a quando la somma non è positiva
- Rimuovi l'oggetto dall'elenco, quindi aggiungilo alla fine del nuovo elenco
Gli articoli 2,4 e 5 prendono tutti n
di tempo, quindi è un algoritmo O(n^2)
.
Può essere migliorato?
Come esempio di un shuffle ponderato, un elemento ha maggiori possibilità di essere 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 nella 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; Sum è 1
Ho scelto 1: 1-1=0
, quindi 1 va nell'ultima posizione, non ho più pesi, ho finito