Ho sognato una struttura di dati, esiste?


27

Non sono riuscito a trovare questa struttura di dati, ma non sono un esperto nel settore.

La struttura implementa un set ed è sostanzialmente una matrice di elementi comparabili con un invariante. L'invariante è il seguente (definito in modo ricorsivo):

Un array di lunghezza 1 è un array di unione.

Un array di lunghezza 2 ^ n (per n> 0) è un iff array merge:

  • la prima metà è un array di unione e la seconda metà è vuota o
  • la prima matrice è piena e ordinata e la seconda metà è una matrice di unione.

Se l'array è pieno, viene ordinato.

Per inserire un elemento, abbiamo due casi:

  • Se la prima metà non è piena, inserire ricorsivamente nella prima metà.
  • Se la prima metà è piena, inserirla in modo ricorsivo nella seconda metà.
  • Dopo il passaggio ricorsivo, se l'intero array è pieno, unisci le metà (che sono ordinate) e ridimensionalo al doppio della sua lunghezza originale.

Per trovare un elemento, ricorrere in entrambe le metà, usando la ricerca binaria quando l'array è pieno. (Questo dovrebbe essere efficiente poiché ci sono al massimo frammenti ascendenti).O(log(n))

La struttura può essere pensata come una versione statica di mergesort.

Non è chiaro cosa si dovrebbe fare per cancellare un elemento.

Modifica: dopo aver migliorato la mia comprensione della struttura.


5
L'hai definito, quindi esiste. Penso che devi appianare alcuni punti, però. Innanzitutto, l'invarianza n. 2 mi confonde poiché non sembra applicarsi agli stati intermedi mentre li descrivi. Secondo, cosa fai quando vengono rimossi gli elementi?
Raffaele,

7
Hai sognato up una struttura di dati, non sognato ...
Andrej Bauer

@Raphael Grazie per i tuoi commenti, ho migliorato la definizione seguendo i tuoi pensieri. Non pensavo a un algoritmo per la rimozione, volevo solo verificare se questa struttura fosse in letteratura prima di dedicare più tempo (e non ho trovato nulla su Google). Nella tua prima frase, puoi definire Dio, ma esiste? :)
pbaren,

@Andrej Grazie, l'inglese non è la mia lingua madre. (Suppongo che non sia neanche tuo :)
pbaren,

3
@Andrej: il PO originariamente aveva "sognato con ", che è quasi certamente non quello che doveva. L'ho cambiato in "of" anziché "up". Entrambi sono grammaticalmente corretti, ma entrambi cambiano anche il significato. "Of" è stata l'opzione di suono più interessante ...
András Salamon,

Risposte:


31

Stai descrivendo il classico metodo logaritmico Bentley-Saxe , applicato ad array ordinati statici. La stessa idea può essere utilizzata per aggiungere supporto per inserimenti a qualsiasi struttura di dati statici (senza inserimenti o eliminazioni) per qualsiasi problema di ricerca scomponibile. (Un problema di ricerca è scomponibile se la risposta per qualsiasi unione può essere calcolata facilmente dalle risposte per gli insiemi A e B. ) La trasformazione aumenta il tempo di query ammortizzato di un fattore di O ( log n ) (a meno che non fosse già più grande di un polinomio in nABABO(logn)n), ma aumenta lo spazio solo di un fattore costante. Sì, può essere deamortizzato, grazie a Overmars e van Leeuwen, ma in realtà non vuoi farlo se non è necessario.

Queste note coprono le basi.

Le matrici di lookahead ignari della cache sono la progenie mutante degli alberi di Bentley-Saxe e van Emde Boas sugli steroidi.


4
Quelle sono note meravigliosamente scritte e illustrate, e le ho usate come riferimento molte volte. Grazie per averli resi disponibili!
jbapple,

Vedo come gli alberi navetta (dalla prima metà del documento che introduce gli array oblivious lookahead cache) sono correlati agli alberi vEB, ma qual è la relazione tra COLA e alberi vEB?
jbapple,

2
Grazie, questo materiale sembra una generalizzazione molto interessante dell'idea. Ho sempre pensato che le strutture di dati siano algoritmi congelati, che puoi eseguire passo dopo passo, ma non avevo mai trovato un'utile formalizzazione di tale intuizione.
pbaren,

Il primo link ha funzionato per qualcun altro?
AL

Sì, l'ho appena provato. (Sfortunatamente, va in un paywall Elsevier; scusate!)
Jeffε

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.