Ordinamento con input continuo

2

Sto progettando (non scrivendo ancora) un sistema di pianificazione delle attività per un videogioco complesso. Il resto del programma gli passa oggetti contenenti una funzione e alcuni metadati che includono una stima di quanto tempo è rimasto prima che i dati siano necessari (che possono cambiare, ovviamente). Lo scheduler è responsabile della prioritizzazione di queste attività e della chiamata della funzione.

L'algoritmo che ho progettato per questo problema è piuttosto semplice; ordina solo il suo elenco di oggetti compito, ne apre uno al di sopra, lo chiama e si ripete. Certo, in realtà è più complesso di così (deve gestire situazioni in cui le cose non possono essere fatte in tempo, dicendo ad altre parti del codice che il loro compito è appena stato buttato giù nella lista ...), ma questo è il succo .

Vorrei qualche consiglio sull'argomento di come ordinerò quella lista. Ovviamente questo ciclo funzionerà costantemente mentre il programma è in esecuzione. Sto pensando di utilizzare una leggera modifica di un algoritmo di ordinamento delle bolle, che esegue un passaggio per ogni iterazione. L'elenco non verrà ordinato correttamente per i primi cicli, ma dal momento che l'elenco sarà probabilmente molto piccolo all'avvio del programma, mi aspetto che sarà in grado di posizionare le cose in modo affidabile con la stessa velocità con cui entrano.

Qualcuno l'ha già fatto prima e come ha funzionato? Ci sono modi migliori per farlo?

    
posta Schilcote 22.08.2013 - 21:57
fonte

1 risposta

6

Dovresti utilizzare una coda prioritaria qui. Una coda prioritaria è una coda in cui gli elementi aggiunti alla coda hanno una priorità e ogni volta che ottieni un oggetto, ottieni l'elemento con la priorità minima (o massima, a seconda dell'implementazione).

Le code di priorità sono generalmente implementate usando un min-heap (o max-heap). Rappresenterà logicamente i dati come un albero completamente bilanciato in cui ogni nodo è "minore di" tutti i suoi figli. Non è tecnicamente un albero di ricerca binario, in cui i dati sono completamente ordinati. (Che è un'alternativa valida che è solo leggermente più costosa.) Poiché i dati non sono in realtà completamente ordinati, significa che le sole operazioni significative che puoi eseguire sono "Dammi il valore più basso" e "aggiungi questo nuovo valore alla raccolta" ". (Per inciso, quelle sono esattamente le due operazioni di cui hai bisogno.) Entrambe le operazioni possono essere eseguite in tempo O (log (n)). Poiché il min-heap assicura che l'albero sia sempre completamente bilanciato, c'è una varianza molto piccola nel caso migliore / peggiore. Anche il caso peggiore è piuttosto basso, a differenza di un albero di ricerca binario che, se diventa sbilanciato, può essere devoluto in O (n) operatiosn.

    
risposta data 22.08.2013 - 22:14
fonte

Leggi altre domande sui tag