Was sind die zeitlichen Komplexitäten verschiedener Datenstrukturen?

83

Ich versuche, die zeitliche Komplexität von Operationen gängiger Datenstrukturen wie Arrays, binärer Suchbaum, Heap, verknüpfter Liste usw. aufzulisten, und beziehe mich insbesondere auf Java. Sie sind sehr häufig, aber ich denke, einige von uns sind nicht 100% sicher über die genaue Antwort. Jede Hilfe, insbesondere Referenzen, wird sehr geschätzt.

Beispiel: Für einfach verknüpfte Listen: Das Ändern eines internen Elements ist O (1). Wie kannst du das machen? Sie MÜSSEN das Element durchsuchen, bevor Sie es ändern. Für den Vektor wird das Hinzufügen eines internen Elements als O (n) angegeben. Aber warum können wir es nicht in amortisierter konstanter Zeit mit dem Index tun? Bitte korrigieren Sie mich, wenn mir etwas fehlt.

Ich poste meine Ergebnisse / Vermutungen als erste Antwort.

Bhushan
quelle
2
Zeit- und
Raumkomplexität
1
Falls jemand anderes darauf eingeht
vefthym

Antworten:

236

Arrays

  • Set, Check Element an einem bestimmten Index: O (1)
  • Suchen : O (n), wenn das Array unsortiert ist, und O (log n), wenn das Array sortiert ist und so etwas wie eine binäre Suche verwendet wird.
  • Wie von Aivean hervorgehoben , ist Deletefür Arrays keine Operation verfügbar. Wir können ein Element symbolisch löschen, indem wir es auf einen bestimmten Wert setzen, z. B. -1, 0 usw., abhängig von unseren Anforderungen
  • Ebenso ist Insertfür Arrays grundsätzlich Setwie eingangs erwähnt

Anordnungsliste:

  • Hinzufügen : Amortisiertes O (1)
  • Entfernen Sie : O (n)
  • Enthält : O (n)
  • Größe : O (1)

Verknüpfte Liste:

  • Einfügen : O (1) , wenn am Kopf, O (n), wenn irgendwo anders, da wir diese Position erreichen müssen, indem wir die verknüpfte Liste linear durchlaufen.
  • Löschen : O (1) , wenn am Kopf, O (n), wenn irgendwo anders, da wir diese Position erreichen müssen, indem wir die verknüpfte Liste linear durchlaufen.
  • Suche : O (n)

Doppelt verknüpfte Liste:

  • Einfügen : O (1) , wenn am Kopf oder Schwanz, O (n), wenn irgendwo anders, da wir diese Position erreichen müssen, indem wir die verknüpfte Liste linear durchlaufen.
  • Löschen : O (1) , wenn am Kopf oder Schwanz, O (n), wenn irgendwo anders, da wir diese Position erreichen müssen, indem wir die verknüpfte Liste linear durchlaufen.
  • Suche : O (n)

Stapel:

  • Drücken Sie : O (1)
  • Pop : O (1)
  • Oben : O (1)
  • Suche (so etwas wie Nachschlagen als spezielle Operation): O (n) (ich denke schon)

Warteschlange / Deque / Circular Queue:

  • Einfügen : O (1)
  • Entfernen Sie : O (1)
  • Größe : O (1)

Binärer Suchbaum:

  • Einfügen, Löschen und Suchen : Durchschnittlicher Fall: O (log n) , schlechtester Fall: O (n)

Rot-Schwarzer Baum:

  • Einfügen, Löschen und Suchen : Durchschnittlicher Fall: O (log n) , schlechtester Fall: O (log n)

Heap / PriorityQueue (min / max):

  • Find Min / Find Max : O (1)
  • Einfügen : O (log n)
  • Min löschen / Max löschen : O (log n)
  • Extrakt Min / Extrakt Max : O (log n)
  • Nachschlagen, Löschen (falls überhaupt angegeben): O (n) , wir müssen alle Elemente scannen, da sie nicht wie BST geordnet sind

HashMap / Hashtable / HashSet:

  • Einfügen / Löschen : O (1) amortisiert
  • Größe ändern / Hash : O (n)
  • Enthält : O (1)
Bhushan
quelle
3
Das Einfügen eines Elements in das Array (und mit Einfügen meine ich das Hinzufügen eines neuen Elements in Position, wobei alle Elemente nach rechts verschoben werden) benötigt O (n). Gleiches gilt für das Löschen. Nur das Ersetzen eines vorhandenen Elements erfordert O (n). Es ist auch möglich, dass Sie es mit dem Hinzufügen eines neuen Elements zum anpassbaren Array gemischt haben (es hat die O (1) -Zeit amortisiert).
Aivean
Bitte beachten Sie auch, dass für doppelt verknüpfte Listen das Einfügen und Löschen von Kopf und Schwanz O (1) erfordert (Sie haben nur den Kopf erwähnt).
Aivean
Und zum Schluss haben ausgeglichene Suchbäume (z. B. ein rot-schwarzer Baum, der tatsächlich für TreeMap in Java verwendet wird) die Worst-Case-Zeit von O (ln n) für alle Operationen garantiert.
Aivean
@Aivean: Ich versuche nur, Standardoperationen für Standarddatenstrukturen aufzulisten. Für Arrays: Das Verschieben von Elementen beim Hinzufügen / Löschen ist keine Standardoperation. Das Ersetzen eines vorhandenen Elements erfordert außerdem O (1) mithilfe des Index und nicht O (n). Für doppelt verknüpfte Liste: Sie haben Recht, ich mache Korrekturen. Für rot-schwarze Bäume: Auch hier haben Sie Recht. Aber ich habe nur eine BST aufgelistet, die nicht ausgeglichen werden muss. Also werde ich einen neuen Eintrag für Rot-Schwarz-Bäume hinzufügen. Danke für die Kommentare!
Bhushan
1
@SuhailGupta: Die Komplexität für Set ist bereits als letzter Punkt angegeben.
Bhushan