Ho un elenco collegato circolare che sembra qualcosa di simile:Dividere un elenco STL?
4 -> 3 -> 2 -> 5 -> 0 -> 1 -> beginning
Voglio dividere questa lista in due segmenti, invertire uno dei segmenti, e poi ricongiungersi con la lista. Qualcosa di simile a questo:
Spalato, un O (1) Operazione 4 ** 3 -> 2 -> 5 ** 0 -> 1 -> beginning
inversa, un O (n) 0 ** 3 -> 2 -> 5 ** 4 -> 1 -> beginning
Rejoin, un O (1) Operazione 0 -> 3 -> 2 -> 5 -> 4 -> 1 -> beginning
Non sembra che STL abbia una lista circolare circolare, ma spero di riuscire a farla franca rappresentando la lista come una lista (in avanti). Questo, richiede: * Un modo per dividere le liste in sottoliste * Un modo per unire le liste insieme
La fusione delle liste parziali insieme dovrebbe essere facile utilizzando std::list::splice, e dovrebbe essere un O (1) il funzionamento. Sìì!
Tuttavia, non riesco a trovare un buon modo O (1) per dividere le liste in sottoliste. One approach utilizza gli iteratori, ma non penso che funzioni nel mio caso perché la sottolista esce dalla fine della lista e riprende all'inizio della lista.
Esiste un modo efficace per implementare questo algoritmo utilizzando l'STL? O dovrei semplicemente rinunciare e scrivere la mia biblioteca circolare collegata?
Grazie!
Se l'operazione totale è O (N), perché si desidera che l'operazione di divisione sia O (1)? In base a questo collegamento non esiste un'implementazione standard di un elenco circolare collegato.http: //stackoverflow.com/questions/947489/does-a-standard-implementation-of-a-circular-list-exist-for-c –
In definitiva , Voglio rendere il mio programma il più velocemente possibile. O (N) split + O (N) reverse sarà più lento di O (1) split + O (N) reverse. Inoltre, sono abbastanza sicuro di poter fare a meno di invertire sempre la sottolista più breve, quindi spero che N sia piccolo in quel caso. –
È per TSP? È possibile che si desideri un albero a due livelli anziché un elenco collegato, che riduce il tempo di esecuzione a O (sqrt (n)) senza il grande fattore costante degli alberi binari (O (log (n))). –