Che cosa si sa sulle strutture di dati che possono mantenere una sequenza di elementi soggetti alle seguenti due operazioni?
- Push (x): aggiunge x alla fine della sequenza e restituisce un identificatore per la sua posizione nella sequenza
- Estrai (S): dato un set non identificato di identificatori, rimuove gli elementi in quelle posizioni dalla sequenza e restituisce un elenco degli elementi rimossi in ordine di sequenza
Se lo desideri, puoi pensare a questo come uno stack o una coda con un'operazione split che lo divide in due stack: l'operazione di estrazione può essere utilizzata per implementare un'operazione pop o dequeue e la sequenza estratta di elementi potrebbe anche essere messa di nuovo in uno stack o in una coda diversi.
Quello che già so: si può mantenere la sequenza come un elenco doppiamente collegato, in cui ciascun identificatore è solo un puntatore a un nodo elenco collegato e ogni nodo memorizza anche un numero di posizione che consente un rapido confronto tra le posizioni di due elementi non correlati nella sequenza. Non è difficile aggiornare i numeri di posizione man mano che la struttura dei dati avanza in modo che siano tutti numeri interi positivi del valore massimo , dove è il numero corrente di elementi nell'elenco. Con questa struttura di dati, l'unica parte difficile di un'operazione di estrazione è l'ordinamento degli elementi estratti in base ai loro numeri di posizione. Un'estrazione di elementi prende tempo atteso randomizzato usando l'algoritmo di ordinamento intero di Han e Thorup di FOCS 2002, per esempio, e un'operazione push richiede tempo costante.
Quello che non so: è possibile gestire l'estrazione in tempo e spingere in tempo costante? C'è letteratura su questo problema? È difficile come l'ordinamento intero?
Motivazione: questo è il passaggio di base necessario per ordinare gli articoli nell'algoritmo di programmazione Coffman-Graham, che ha anche applicazioni nel disegno grafico. La parte difficile di Coffman-Graham è un ordinamento topologico lessicografico. Questo può essere fatto mantenendo, per ogni diverso indegree, una sequenza di vertici con quell'indegree nel sottografo indotto dai vertici rimanenti. Quindi, rimuovere ripetutamente il primo vertice dalla sequenza di vertici a zero gradi e aggiungerlo all'ordine topologico; estrarre i vicini di dai gradi a cui appartenevano in precedenza e spingerli sulla sequenza per il grado inferiore successivo. Quindi una il tempo per le operazioni di estrazione in questa struttura di dati porterebbe a un'implementazione temporale lineare dell'algoritmo di Coffman-Graham.
Da quando lo avevo chiesto inizialmente, ho trovato un articolo di Sethi del 1976 che consente di implementare l'algoritmo di Coffman-Graham in tempo lineare e l'ho incluso nel mio articolo di Wikipedia sull'algoritmo di Coffman-Graham , quindi la motivazione originale è meno significativa. Sono comunque curioso di sapere quale sia la risposta.