Problema: ho bisogno di ottenere un elemento casuale per un contenitore e di cancellarlo anche da quel contenitore. Il contenitore non ha bisogno di essere ordinato. Non mi interessa l'ordine.Ottieni elementi casuali e rimuovilo
- Vector me può ottenere elemento casuale in
O(1)
ma eliminarlo solo nelO(N)
- Lista cancella elemento
O(1)
ma può ottenere solo elemento casuale inO(N)
Così mi è venuta un'idea di creare un vettore personalizzato che consente di rimuovere qualsiasi elemento dal suo indice con la complessità O(1)+
. L'idea è di scambiare l'ultimo elemento e un elemento che si desidera rimuovere e quindi pop_back()
. Se è necessario rimuovere l'ultimo elemento - solo pop_back()
. L'ordine del vettore non sarà lo stesso ma si ottiene un metodo di rimozione veloce.
Come posso capire che deque ha un accesso più lento per indice e una complessità di rimozione peggiore della mia soluzione, ma non sono sicuro al 100%.
Sono curioso ci sono strutture di dati che hanno accesso casuale e rimozione elemento in O(1)
o O(logN)
per indice o mb per valore?
Perché hai dovuto creare un vettore personalizzato per questo? Basta scambiare l'elemento fino alla fine e rimuoverlo da lì? Questo non ha bisogno di essere una classe speciale. –
Ti ho dato una soluzione se vuoi mantenere l'ordine degli elementi, sarebbe O (log N) complessità. – CashCow
@NicolBolas Ha trovato una soluzione (non è sicuro del motivo per cui voleva una nuova collezione) ma ha chiesto se c'è una soluzione O (1) o O (log N). Sappiamo che esiste una soluzione a tempo costante (come l'ha trovata lui stesso), quindi l'O (log N) potrebbe significare solo uno che mantiene l'ordine. – CashCow