Was sind die Unterschiede zwischen Segmentbäumen, Intervallbäumen, binär indizierten Bäumen und Bereichsbäumen?

200

Was sind Unterschiede zwischen Segmentbäumen, Intervallbäumen, binär indizierten Bäumen und Bereichsbäumen in Bezug auf:

  • Schlüsselidee / Definition
  • Anwendungen
  • Leistung / Auftrag in höheren Dimensionen / Platzverbrauch

Bitte geben Sie nicht nur Definitionen an.

Aditya
quelle
12
Es ist kein Duplikat. Diese Frage ist, ob Fenwick-Bäume eine Verallgemeinerung der Intervallsträhne sind, und meine Frage ist spezifischer und anders.
Aditya
7
Es wurde nicht unter stackoverflow.com/questions/2795989/… beantwortet , die Antwort dort gibt nur eine Definition.
Aditya
12
Wie ist es zu breit? "Was sind einige Unterschiede zwischen x und y?" ist so klar und konzentriert wie es nur geht. Das ist eine sehr gute Frage.
IVlad
16
Und dafür gibt es nirgendwo eine gute Antwort. Eine gute Antwort wird großartig für die Community sein
Aditya
22
Die meisten dieser Datenstrukturen (mit Ausnahme von Fenwick-Bäumen) werden in diesem PDF überprüft: "Intervall-, Segment-, Bereichs- und Prioritätssuchbäume" (von DT Lee). Oder Sie können es als Kapitel aus diesem Buch lesen: "Handbuch für Datenstrukturen und Anwendungen" .
Evgeny Kluev

Antworten:

318

Alle diese Datenstrukturen werden zur Lösung verschiedener Probleme verwendet:

  • Der Segmentbaum speichert Intervalle und ist für Abfragen optimiert, bei denen " welches dieser Intervalle einen bestimmten Punkt enthält ".
  • Der Intervallbaum speichert auch Intervalle, ist jedoch für Abfragen optimiert, " welche dieser Intervalle sich mit einem bestimmten Intervall überschneiden ". Es kann auch für Punktabfragen verwendet werden - ähnlich wie beim Segmentbaum.
  • Der Bereichsbaum speichert Punkte und optimiert für Abfragen, " welche Punkte in ein bestimmtes Intervall fallen ".
  • Der binär indizierte Baum speichert die Anzahl der Elemente pro Index und ist für die Abfrage " Wie viele Elemente befinden sich zwischen Index m und n " optimiert .

Leistung / Platzverbrauch für eine Dimension:

  • Segmentbaum - O (n logn) Vorverarbeitungszeit, O (k + logn) Abfragezeit, O (n logn) Raum
  • Intervallbaum - O (n logn) Vorverarbeitungszeit, O (k + logn) Abfragezeit, O (n) Raum
  • Bereichsbaum - O (n logn) Vorverarbeitungszeit, O (k + logn) Abfragezeit, O (n) Raum
  • Binär indizierter Baum - O (n logn) Vorverarbeitungszeit, O (logn) Abfragezeit, O (n) Raum

(k ist die Anzahl der gemeldeten Ergebnisse).

Alle Datenstrukturen können dynamisch sein, da das Nutzungsszenario sowohl Datenänderungen als auch Abfragen umfasst:

  • Segmentbaum - Intervall kann in O (logn) Zeit hinzugefügt / gelöscht werden (siehe hier )
  • Intervallbaum - Intervall kann in O (logn) Zeit hinzugefügt / gelöscht werden
  • Bereichsbaum - Neue Punkte können in O (logn) Zeit hinzugefügt / gelöscht werden (siehe hier )
  • Binär indizierter Baum - Die Anzahl der Elemente pro Index kann in O (logn) -Zeit erhöht werden

Höhere Abmessungen (d> 1):

  • Segmentbaum - O (n (logn) ^ d) Vorverarbeitungszeit, O (k + (logn) ^ d) Abfragezeit, O (n (logn) ^ (d-1)) Raum
  • Intervallbaum - O (n logn) Vorverarbeitungszeit, O (k + (logn) ^ d) Abfragezeit, O (n logn) Raum
  • Bereichsbaum - O (n (logn) ^ d) Vorverarbeitungszeit, O (k + (logn) ^ d) Abfragezeit, O (n (logn) ^ (d-1))) Raum
  • Binär indizierter Baum - O (n (logn) ^ d) Vorverarbeitungszeit, O ((logn) ^ d) Abfragezeit, O (n (logn) ^ d) Raum
Lior Kogan
quelle
12
Ich habe wirklich den Eindruck, dass Segmentbäume <Intervallbäume davon sind. Gibt es einen Grund, einen Segmentbaum zu bevorzugen? ZB einfache Implementierung?
j_random_hacker
7
@j_random_hacker: Auf Segmentbäumen basierende Algorithmen haben Vorteile in bestimmten komplexeren hochdimensionalen Varianten der Intervallabfrage. Finden Sie beispielsweise heraus, welche nicht achsparallelen Liniensegmente sich mit einem 2D-Fenster schneiden.
Lior Kogan
5
Vielen Dank, ich würde mich für jede Ausarbeitung interessieren, die Sie dazu geben könnten.
j_random_hacker
3
@j_random_hacker, Segmentbäume haben eine weitere interessante Verwendung: RMQs (Bereichsminimumabfragen) in O-Zeit (log N), wobei N die Gesamtintervallgröße ist.
Ars-Longa-Vita-Brevis
1
Warum sind Segmentbäume O (n log n) Raum? Sie speichern N Blätter + N / 2 + N / 4 + ... + N / 2 ^ (log N), und diese Summe ist O (N), wenn ich mich nicht irre. Auch @ icc97 Antwort meldet auch O (N) Leerzeichen.
Ameise
24

Nicht, dass ich Lior's Antwort etwas hinzufügen könnte könnte, aber es scheint, als könnte es einen guten Tisch vertragen.

Eine Dimension

k ist die Anzahl der gemeldeten Ergebnisse

|              | Segment       | Interval   | Range          | Indexed   |
|--------------|--------------:|-----------:|---------------:|----------:|
|Preprocessing |        n logn |     n logn |         n logn |    n logn |
|Query         |        k+logn |     k+logn |         k+logn |      logn |
|Space         |        n logn |          n |              n |         n |
|              |               |            |                |           |
|Insert/Delete |          logn |       logn |           logn |      logn |

Höhere Abmessungen

d > 1

|              | Segment       | Interval   | Range          | Indexed   |
|--------------|--------------:|-----------:|---------------:|----------:|
|Preprocessing |     n(logn)^d |     n logn |      n(logn)^d | n(logn)^d |
|Query         |    k+(logn)^d | k+(logn)^d |     k+(logn)^d |  (logn)^d |
|Space         | n(logn)^(d-1) |     n logn | n(logn)^(d-1)) | n(logn)^d |

Diese Tabellen werden in Github-formatiertem Markdown erstellt. Sehen Sie sich diese Liste an, wenn Sie möchten, dass die Tabellen gut formatiert werden.

icc97
quelle
2
Was meinen Sie mit gemeldeten Ergebnissen?
Pratik Singhal
@ ps06756 Suchalgorithmen haben häufig eine Laufzeit von log (n), wobei n die Eingabegröße ist, können jedoch lineare Ergebnisse in n liefern, die nicht in logarithmischer Zeit ausgeführt werden können (die Ausgabe von n Zahlen in log (n) ist nicht möglich). .
Oerpli
1
Sollte Segment Tree nicht O(n logn) spacein der ersten Tabelle enthalten sein?
Danny_ds