Quali sono le complessità temporali di varie strutture di dati?


87

Sto cercando di elencare le complessità temporali delle operazioni di strutture dati comuni come Arrays, Binary Search Tree, Heap, Linked List, ecc. E in particolare mi riferisco a Java. Sono molto comuni, ma immagino che alcuni di noi non siano sicuri al 100% della risposta esatta. Qualsiasi aiuto, in particolare i riferimenti, è molto apprezzato.

Ad esempio, per elenchi collegati singolarmente: la modifica di un elemento interno è O (1). Come si può fare? tu HAI per cercare l'elemento prima di cambiarlo. Inoltre, per il vettore, l'aggiunta di un elemento interno è data come O (n). Ma perché non possiamo farlo in tempo costante ammortizzato utilizzando l'indice? Per favore correggimi se mi manca qualcosa.

Inserisco le mie scoperte / ipotesi come prima risposta.


2
Complessità temporali e spaziali per tutte le strutture dati
Cheat

1
Nel caso in cui qualcun altro intervenga,
dedica

Risposte:


247

Arrays

  • Imposta, controlla l' elemento in un indice particolare: O (1)
  • Ricerca : O (n) se array non è ordinato e O (log n) se array è ordinato e viene utilizzata una ricerca binaria,
  • Come sottolineato da Aivean , non esisteDelete operazioni su Arrays. Possiamo eliminare simbolicamente un elemento impostandolo su un valore specifico, ad esempio -1, 0, ecc. A seconda delle nostre esigenze
  • Allo stesso modo, Insertper gli array è fondamentalmente Setcome menzionato all'inizio

Lista di array:

  • Aggiungi : Ammortizzato O (1)
  • Rimuovi : O (n)
  • Contiene : O (n)
  • Taglia : O (1)

Lista collegata:

  • Inserimento : O (1) , se fatto in testa, O (n) se altrove poiché dobbiamo raggiungere quella posizione percorrendo linearmente la linkedlist.
  • Cancellazione : O (1) , se fatto in testa, O (n) se altrove poiché dobbiamo raggiungere quella posizione percorrendo linearmente la lista collegata.
  • Ricerca : O (n)

Elenco a doppio collegamento:

  • Inserimento : O (1) , se fatto in testa o in coda, O (n) se altrove poiché dobbiamo raggiungere quella posizione percorrendo linearmente la linkedlist.
  • Cancellazione : O (1) , se eseguita in testa o in coda, O (n) se altrove poiché dobbiamo raggiungere quella posizione percorrendo linearmente la lista collegata.
  • Ricerca : O (n)

Pila:

  • Spingere : O (1)
  • Pop : O (1)
  • In alto : O (1)
  • Cerca (qualcosa di simile alla ricerca, come operazione speciale): O (n) (credo di sì)

Coda / Rimuovi / Coda circolare:

  • Inserto : O (1)
  • Rimuovi : O (1)
  • Taglia : O (1)

Albero di ricerca binario:

  • Inserisci, elimina e cerca : caso medio: O (log n) , caso peggiore: O (n)

Albero rosso-nero:

  • Inserisci, elimina e cerca : caso medio: O (log n) , caso peggiore: O (log n)

Heap / PriorityQueue (min / max):

  • Trova minimo / Trova massimo : O (1)
  • Inserisci : O (log n)
  • Elimina min / Elimina max : O (log n)
  • Estrai min / Estrai max : O (log n)
  • Cerca, Elimina (se fornito): O (n) , dovremo scansionare tutti gli elementi poiché non sono ordinati come BST

HashMap / Hashtable / HashSet:

  • Inserisci / Elimina : O (1) ammortizzato
  • Ridimensiona / hash : O (n)
  • Contiene : O (1)

3
Inserendo un elemento in Array (e per insert intendo aggiungere un nuovo elemento in posizione, spostando tutti gli elementi a destra) richiederà O (n). Lo stesso per la cancellazione. Solo la sostituzione di un elemento esistente richiederà O (n). Inoltre è possibile che tu l'abbia combinato con l'aggiunta di un nuovo elemento all'array ridimensionabile (ha ammortizzato O (1) tempo).
Aivean

Inoltre, tieni presente che per le liste a doppio collegamento l'inserimento e l'eliminazione sia della testa che della coda richiederà O (1) (hai menzionato solo la testa).
Aivean

E nota finale, alberi di ricerca bilanciati (ad esempio, albero rosso-nero che viene effettivamente utilizzato per TreeMap in Java) ha garantito il tempo O (ln n) nel caso peggiore per tutte le operazioni.
Aivean

@Aivean: Sto solo cercando di elencare le operazioni standard per strutture dati standard. Per gli array: lo spostamento di elementi durante l'aggiunta / eliminazione non è un'operazione standard. Inoltre, la sostituzione di un elemento esistente richiede O (1) utilizzando index, non O (n). Per l'elenco a doppio collegamento: hai ragione, sto apportando una correzione. Per gli alberi rosso-neri: Ancora una volta, hai ragione. Ma ho elencato solo una BST, che non deve essere bilanciata. Quindi, aggiungerò una nuova voce per Red-Black Trees. Grazie per i commenti!
Bhushan

1
@SuhailGupta: La complessità per Set è già data come ultimo punto.
Bhushan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.