Ho bisogno di alcune risposte esperte per aiutarmi a determinare l'algoritmo più efficiente in questo scenario.
Considera le seguenti strutture di dati:
type B { A parent; }
type A {
set<B> children;
integer minimumChildrenAllowed;
integer maximumChildrenAllowed;
}
Ho una situazione in cui ho bisogno di recuperare tutti i bambini orfani (potrebbero essercene centinaia di migliaia) e assegnarli CASUALMENTE a genitori di tipo A in base alle seguenti regole.
- Alla fine del lavoro, dovrebbe non rimanere orfano
- Alla fine del lavoro, nessun oggetto A dovrebbe avere meno figli del suo minimo predesignato.
- Alla fine del lavoro, nessun oggetto A dovrebbe avere più figli del suo massimo predeterminato.
- Se esauriamo gli oggetti A, dovremmo creare una nuova A con i valori predefiniti per il minimo e il massimo e assegnare gli orfani rimanenti a questi oggetti.
- La distribuzione dei bambini dovrebbe essere distribuita il più equamente possibile.
- Potrebbero esserci già alcuni bambini assegnati ad A prima dell'inizio del lavoro.
Stavo giocando con il modo di farlo, ma temo che finirei semplicemente per andare in loop tra i genitori, dal più piccolo al più grande, e poi prendere un orfano per ciascun genitore.
Mi stavo chiedendo se esiste un modo più efficiente di gestirlo?
Modifica
-
Espandendo i criteri per una distribuzione uniforme dei bambini, dovremmo cercare di evitare una situazione in cui una A ha 2 o più figli di qualsiasi altra A, a meno che non siano iniziati in quel modo. Ad esempio, se A1 ha 4 figli e A2 e A3 hanno 1 figlio ciascuno e ci sono 2 orfani, A2 e A3 dovrebbero essere assegnati a tutti gli orfani che fanno una distribuzione uniforme di 4, 3 e 3 figli per ogni A.
-
Sì, capisco che potremmo finire dove rimane un orfano e un A che non ha raggiunto il suo minimo. Questa eccezione sarà gestita da un algoritmo separato che tenterà di dividere equamente una A in due oggetti e assegnare gli orfani rimanenti tra loro.
EDIT: 2
Ok, ho frainteso i requisiti della mia situazione. Il modello dati per A mostra la proprietà minima e massima, ma in realtà dovrebbe essere un'impostazione globale per ogni A. In sostanza è un requisito mancato che richiede il refactoring del modello di dati in un secondo momento.
Tutti A avranno lo stesso minimo e massimo ora. Questo in realtà cambia le cose in modo significativo! Ci scusiamo per la confusione.