Ho bisogno di inserire un elemento nell'intervallo ordinato, ma ho anche bisogno di conoscere il suo indice (numero di elementi nell'intervallo che sono inferiori all'elemento). Voglio farlo in tempo O (logN). Posso farlo con contenitori C++ di base?Il modo più efficace per inserire un elemento nell'array ordinato e trovare il suo indice
Stavo pensando di utilizzare std :: multimap, con questo contenitore posso inserire l'elemento al suo posto con O (logN) complessità. Ma per ottenere l'indice, ho bisogno di chiamare std :: distance, che richiede operazioni O (N), poiché l'iteratore multimap non è un accesso casuale.
Un altro modo è quello di utilizzare ordinato std :: vector e std :: binary_search algoritmo. In questo caso la ricerca prende O (logN), ma l'inserimento richiederà operazioni O (N), poiché l'inserimento nel mezzo del vettore è un'operazione lineare.
Quindi, c'è un contenitore std/boost che posso utilizzare per raggiungere il risultato oppure devo implementare la mia propria struttura per questo? Grazie!
io non sono al passo con le garanzie di complessità di Boost MultiIndex, ma potresti dare un'occhiata a – sehe
Immagino sia possibile con un'implementazione personalizzata albero/skiplist, quando si tiene traccia del numero di elementi rappresentati da ciascun nodo (interno). Ma sei consapevole che un tale indice viene invalidato una volta inserito un altro elemento? – leemes
Quanto è grande la gamma di indici di cui stiamo parlando? Se non è così grande (alcuni milioni) potresti usare un albero di Fenwick, che è piuttosto facile da codificare.Altrimenti potresti codificare un albero binario bilanciato e ricordare il numero di nodi in ogni sottostruttura. I contenitori std AFAIK non sono di grande aiuto qui. Mi piacerebbe sapere se c'è qualcosa in boost però. – ead