Struttura dei dati con ricerca, inserimento ed eliminazione in tempo ammortizzato


25

Esiste una struttura di dati per mantenere un elenco ordinato che supporta le seguenti operazioni nel tempo ammortizzato ?O(1)

  • GetElement (k) : restituisce il ° elemento dell'elenco.k

  • InsertAfter (x, y) : inserire il nuovo elemento y nell'elenco immediatamente dopo x.

  • Elimina (x) : rimuove x dall'elenco.

Per le ultime due operazioni, puoi supporre che x sia dato come puntatore direttamente nella struttura dei dati; InsertElement restituisce il puntatore corrispondente per y. InsertAfter (NULL, y) inserisce y all'inizio dell'elenco.

Ad esempio, a partire da una struttura di dati vuota, le seguenti operazioni aggiornano l'elenco ordinato come mostrato di seguito:

  • InsertAfter (NULL, a) [un]
  • InsertAfter (NULL, b) [b, a]
  • InsertAfter (b, c) [b, c, a]
  • InsertAfter (a, d) [b, c, a, d]
  • Delete (c) [male]

Dopo questi cinque aggiornamenti, GetElement (2) dovrebbe restituire d e GetElement (3) dovrebbe restituire un errore.


2
In Optimal Algorithms for List Indexing and Subset Rank (1989) ho trovato un soluzione a questo problema. Ω(log nlog log n)
AL

2
@Raphael: Penso che significhi l'elemento che sarebbe chiamato se la struttura dei dati fosse un array. Le matrici supportano la prima operazione in O ( 1 ) volta ma non la seconda; gli elenchi collegati supportano la seconda operazione in O ( 1 ) volta ma non la prima. A[k]O(1)O(1)
JeffE,

2
Inoltre, alberi binari bilanciati supportano entrambe le operazioni nel tempo . O(logn)
JeffE,

1
@Raphael: a cura di chiarire.
JeffE,

2
@JeffE l'array dinamico supporta i primi due in tempo ammortizzato ( cs.uwaterloo.ca/research/tr/1999/09/CS-99-09.pdf )O(1)
Diego

Risposte:


33

NO.

Fredman e Saks hanno dimostrato che qualsiasi struttura di dati che supporta queste operazioni richiede almeno tempo ammortizzato per operazioneΩ(logn/loglogn) . (Questo è il riferimento [1] nel lavoro di Dietz che si parla nel vostro primo commento.) Il limite inferiore tiene nel molto potente modello di sonda cella di calcolo, che considera solo il numero di indirizzi di memoria distinte cui accede l'aggiornamento e interrogazione algoritmi.

Senza alcune ipotesi aggiuntive sulle operazioni di aggiornamento e query, la struttura dei dati di Dietz è la migliore possibile (almeno fino a fattori costanti).


3
@AT: quel limite non è mai stato "dimostrato sbagliato". Ci sono situazioni in cui non si applica, ma questa è un'affermazione completamente diversa!
Raffaello

5
@AT: il limite inferiore dell'ordinamento è stato dimostrato in un modello di calcolo molto più debole, vale a dire alberi binari di decisione. Il limite è stato "dimostrato sbagliato" sviluppando algoritmi più veloci che non possono essere descritti come alberi di decisione binari. Per dimostrare che il limite inferiore di Fredman e Saks è sbagliato, dovrai progettare un algoritmo più veloce che non acceda alla memoria . Buona fortuna.
JeffE,

@JeffE e Raffaello; per favore rivedi la mia altra risposta e conferma / nega il mio risultato quando ne hai la possibilità. Grazie.
AL

6

1
Ω(logn/loglogn)

Infatti. Inoltre, puoi confermare che questo limite si applica al problema di rappresentazione dell'elenco con parole di dimensioni costanti?
All'11

1
Θ(logn/loglogn) Ω(logn)
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.