Stack divisibile


22

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 O(n) , dove n è 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 k elementi prende O(kloglogk)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 O(k) 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 v dalla sequenza di vertici a zero gradi e aggiungerlo all'ordine topologico; estrarre i vicini di v dai gradi a cui appartenevano in precedenza e spingerli sulla sequenza per il grado inferiore successivo. Quindi una O(k) 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.


Se gli inserimenti avvengono solo alla fine della sequenza, è possibile mantenere sia un doppio elenco collegato che una tabella hash delle posizioni degli elementi. Inserimento: ammortizzato O (1) (basta tenere un puntatore all'ultimo elemento). Estrazione di k elementi: O (k) ammortizzato (per ogni elemento di S, ottenere il puntatore e rimuoverlo dalla tabella hash, ottenere e rimuovere l'elemento dall'elenco e aggiungerlo al risultato dell'estrazione).
Marzio De Biasi,

3
Non è l'estrazione degli elementi dall'elenco che richiede tempo, ma li sta riorganizzando dall'ordine non ordinato dell'argomento per estrarre nell'ordine corretto della sequenza.
David Eppstein,

Risposte:


1

Penso che sia difficile almeno quanto ordinare un set di numeri interi con "consigli casuali" di dimensioni polinomiali in n . Per consulenza casuale intendo che per qualsiasi n esiste una distribuzione fissa D n (dipendente solo da n ) su stringhe di dimensione poly ( n ) e al nostro algoritmo (modellato da una macchina RAM) viene dato l'accesso casuale a un singolo campione da D n . D n è la struttura dei dati (randomizzata) dopo aver premuto [ n ]S[n]nnDnnnDnDn[n]in ordine, insieme a una tabella hash che associa numeri interi a identificatori nel tempo previsto.O(1)

Dato che l'installazione, per un'istanza del problema di ordinamento di numeri interi, possiamo emettere extract ( S ) (in realtà abbiamo bisogno degli identificatori di S ma questa mappatura può essere fatta in O ( 1 ) tempo per elemento usando l'hash tabella che fa parte del consiglio) e l'input verrà ordinato nel tempo necessario per eseguire l'estrazione.S[n]SSO(1)

Quindi, il messaggio è che, a meno che alcune informazioni laterali "libere" che dipendono solo dal limite superiore degli interi possano rendere più facile l'ordinamento degli interi, l'estrazione è dura quanto l'ordinamento degli interi.

Ciò implica una relazione tra i due problemi senza il modello strano? Questa nozione di consiglio casuale è nota? Questo è un po 'come un protocollo MA, ma il messaggio di Merlin non può dipendere dall'input e ci preoccupiamo del tempo di esecuzione di Arthur.


Premere su D n richiede Ω ( n ) tempo, quindi avere libero accesso a[n]DnΩ(n) è come avere uncalcoloΩ(n)già fatto all'inizio dell'algoritmo. Dato che puoi ordinareknumeri interi estratti da[n]nel tempoO(n+k), non c'è motivo di aspettarti che l'ordinamento con accesso gratuito a questa struttura di dati richiederebbe più diO(k)tempo. DnΩ(n)k[n]O(n+k)O(k)
Dave,

Hai Ω(n)DnkO(k)Dn

Ecco il motivo per cui non trovo questa risposta del tutto convincente. Se hai solo un set S di numeri interi che desideri ordinare, tutto è tempo lineare (basta contare l'ordinamento in O (n + k)). Ma se stai cercando di utilizzare questa struttura di dati per simulare una sequenza di molti piccoli tipi (in modo che il conteggio degli ordinamenti non sia abbastanza buono), solo il primo di questi piccoli tipi è completamente libero: dopo ciò, hai rimosso alcuni degli elementi di [n], quindi ogni sequenza che ordinate deve essere disgiunta dalle precedenti. Quindi sembra difficile ridurre il lavoro di smistamento.
David Eppstein,

@ David Eppstein: per O(k)O(n+k)

Ω(n)DnO(k)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.