Conosco abbastanza bene dove usare pile, code e alberi nelle applicazioni software ma non ho mai usato una Deque (coda doppia) prima. Dove li incontro di solito in natura? Sarebbe negli stessi posti di una coda ma con ulteriori problemi?
Conosco abbastanza bene dove usare pile, code e alberi nelle applicazioni software ma non ho mai usato una Deque (coda doppia) prima. Dove li incontro di solito in natura? Sarebbe negli stessi posti di una coda ma con ulteriori problemi?
Risposte:
Un modo in cui viene usato un deque è "invecchiare" gli oggetti. In genere viene utilizzato come funzionalità di annullamento o cronologia. Una nuova azione viene inserita nel deque. Gli oggetti più vecchi sono nella parte anteriore. Un limite alle dimensioni del deque impone la rimozione degli oggetti nella parte anteriore quando vengono inseriti nuovi oggetti (invecchiamento degli oggetti più vecchi). Fornisce quindi un modo rapido per accedere a entrambe le estremità della struttura perché si conoscono all'istante gli elementi più vecchi e più recenti per rimuovere il fronte e commettere l'azione più vecchia in O (1) o annullare in O (1).
Ottima domanda Non ricordo il nostro corso CS 102 che menzionava una singola applicazione per la coda doppia.
Fino ad oggi, l'unica applicazione che conosco è lo scheduler che ruba il lavoro menzionato nell'articolo di Wikipedia .
Funziona essenzialmente come segue:
In un normale modello procedurale a thread singolo, ogni chiamata di funzione invia un record di attivazione su un cosiddetto stack di chiamate . Un record di attivazione contiene le variabili e i parametri locali di quella chiamata. Una volta completata la chiamata al metodo ("restituisce"), l'ultimo record di attivazione viene estratto dallo stack di chiamate.
Ciò è particolarmente importante perché è così che viene implementata la ricorsione: la struttura della ricorsione è rappresentata nello stato corrente dello stack di chiamate.
Quando si parallelizza un algoritmo ricorsivo, possiamo sfruttare questa proprietà sostituendo lo stack di chiamate con una coda di chiamata. Ogni thread nel calcolo ottiene la propria coda di chiamate e invia e apre i record di attivazione come in un'esecuzione sequenziale.
Ma una volta che un thread ha terminato il suo lavoro (= la sua coda di chiamata è vuota), ruba il lavoro da un altro thread rimuovendo un record di attivazione dalla coda di chiamata di quel thread rimuovendo dall'estremità "errata".
Fondamentalmente, la coda di chiamata funge da due stack di chiamate che ora servono due thread.