Sono di fronte a un'applicazione in cui devo progettare un contenitore che ha accesso casuale (o almeno migliore di O (n)) ha un inserto e una rimozione poco costosi (O (1)) e memorizza i dati secondo l'ordine (rank) specificato all'inserimento.Struttura dati di mantenimento dei ranghi diversa da std :: vector?
Per esempio se ho la seguente matrice:
[2, 9, 10, 3, 4, 6]
posso chiamare l'rimuovere sull'indice 2 per rimuovere 10 e posso anche chiamare il inserto sull'indice 1 inserendo 13.
Dopo queste due operazioni avrei dovuto:
[2, 13, 9, 3, 4, 6]
I numeri sono memorizzati in una sequenza e inserire/rimuovere operazioni richiedono un parametro di indice per specificare in cui inserire il numero o quale numero deve essere rimosso.
La mia domanda è, che tipo di strutture dati, oltre a un elenco collegato e un vettore, potrebbe mantenere qualcosa di simile? Mi sto appoggiando ad un Heap che dà la priorità al prossimo indice disponibile. Ma ho visto qualcosa su un albero di fusione utile (ma più in senso teorico).
Che tipo di strutture dati potrebbero darmi il miglior tempo di funzionamento pur mantenendo basso il consumo di memoria? Ho giocato con un ordine di inserimento preservando la tabella hash, ma finora non ha avuto successo.
La ragione per cui sto tirare fuori con uno std :: vector verso l'alto è perché devo costruire qualcosa che su preforme un vettore in termini di queste operazioni di base. La dimensione del contenitore ha la possibilità di crescere fino a centinaia di migliaia di elementi, quindi non è possibile effettuare il commit a turni in un vettore std ::. Lo stesso problema con una lista collegata (anche se doppiamente collegato), attraversandolo a un dato indice prenderebbe nel caso peggiore O (n/2), che è arrotondato a O (n).
Stavo pensando a un elenco di collegamenti raddoppiati che conteneva un puntatore Testa, Coda e Medio, ma ho ritenuto che non sarebbe stato molto meglio.
Una volta che hai detto che vuoi: accedere a un elemento in base al suo grado, rimuovere un elemento in un determinato rango e inserire un elemento in un determinato rango, perché vuoi qualcosa di diverso da un elenco collegato (std :: elenco) o array dinamico (std :: vector)? Si prega di fornire i requisiti prima che questa domanda possa essere considerata non chiara. –
Vuoi ripetere la raccolta? Qual è la dimensione approssimativa della collezione? –
@Serge Ballesta Il tempo necessario per rimuovere un determinato elemento in un vettore è O (n) nel caso peggiore. Inoltre, attraversare una lista collegata è orribile nel senso di una grande quantità di nodi. –