Modifiche elenco collegato implicano due operazioni:
- localizzare il nodo per aggiungere il nuovo nodo di
- effettivamente aggiungendo il nodo, cambiando i puntatori nodo
In lista concatenata, la seconda operazione è un'operazione O(1)
, quindi si tratta del costo delle prime operazioni.
Quando aggiungendo all'ultimo nodo, implementazioni naif lista collegata comporterebbe O(n)
iterazione tempo. Tuttavia, le buone librerie di elenchi collegati rappresentano gli usi più comuni e casi speciali che accedono all'ultimo nodo. Questa ottimizzazione si tradurrebbe in recupero O(1)
dell'ultimo elemento, con conseguente tempo di inserimento complessivo O(1)
alla fine.
Per quanto riguarda il mezzo, la tua analisi è corretta in quanto localizzare il nodo sarebbe anche prendere O(n)
. Tuttavia, alcune librerie espongono un metodo che utilizza un puntatore a cui deve essere inserito il nuovo nodo anziché l'indice (ad esempio C++
list
). Questo elimina il costo lineare, risultando in tutto O(1)
.
Mentre l'inserimento al centro è solitamente pensato come operazione O(n)
, può essere ottimizzato in O(1)
in alcuni casi.Questo è l'opposto della lista di matrice, in cui l'operazione di inserimento stessa (la seconda operazione) è O(n)
, poiché tutti gli elementi in posizioni più alte devono essere riposizionati. Questa operazione non può essere ottimizzata.
Per l'inserimento Un'implementazione ingenua di un elenco collegato comporterebbe il tempo di inserimento O(n)
. Tuttavia, i buoni scrittori di librerie di elenchi collegati ottimizzerebbero per i casi comuni, in modo da mantenere un riferimento agli ultimi elementi (o avere un'implementazione di elenchi concatenati circolari), risultando in un tempo di inserimento O(1)
.
Come per l'inserimento al centro. Alcune librerie come quella di C++
hanno una posizione suggerita per l'inserimento. Prenderanno un puntatore al nodo della lista, dove sarà aggiunto il nuovo. Tali inserzioni costerebbero O(1)
. Non penso che tu possa raggiungere O(1)
per numero di indice.
Questo è assegnato a un elenco di array, in cui l'inserimento al centro richiede il riordino di tutti gli elementi più alti di esso, quindi deve essere un'operazione O(n)
.
Se l'inserimento al centro dell'elenco fosse O (1) non avremmo più bisogno di array :). – Li0liQ
Li0liQ: uno dei vantaggi delle liste concatenate è che è possibile inserire gli elementi nel mezzo in tempo costante, dove negli array è necessario spostare tutti gli elementi seguenti. – Amnon
@ Li0liQ: che dire dell'indicizzazione del tempo costante? – sykora