Ich habe von einer Datenstruktur geträumt, existiert sie?

27

Ich habe es nicht geschafft, diese Datenstruktur zu finden, bin aber kein Experte auf diesem Gebiet.

Die Struktur implementiert eine Menge und besteht im Wesentlichen aus einer Reihe vergleichbarer Elemente mit einer Invariante. Die Invariante ist die folgende (rekursiv definierte):

Ein Array der Länge 1 ist ein Merge-Array.

Ein Array der Länge 2 ^ n (für n> 0) ist ein Merge-Array, wenn:

  • Die erste Hälfte ist ein Merge-Array und die zweite Hälfte ist leer oder
  • Das erste Array ist voll und sortiert, und die zweite Hälfte ist ein Merge-Array.

Beachten Sie, dass das Array sortiert wird, wenn es voll ist.

Um ein Element einzufügen, haben wir zwei Fälle:

  • Wenn die erste Hälfte nicht voll ist, fügen Sie sie rekursiv in die erste Hälfte ein.
  • Wenn die erste Hälfte voll ist, rekursiv in die zweite Hälfte einfügen.
  • Wenn das gesamte Array nach dem rekursiven Schritt voll ist, führen Sie die sortierten Hälften zusammen und ändern Sie die Größe auf das Doppelte der ursprünglichen Länge.

Um ein Element zu finden, verwenden Sie die Binärsuche in beiden Hälften, wenn das Array voll ist. (Dies sollte effizient sein, da höchstens aufsteigende Fragmente vorhanden sind.)O(log(n))

Die Struktur kann als statische Version von Mergesort betrachtet werden.

Es ist nicht klar, was man tun soll, um ein Element zu löschen.

Edit: nachdem ich die Struktur besser verstanden habe.

pbaren
quelle
5
Sie haben es definiert, es existiert also. Ich denke, Sie müssen jedoch einige Punkte ausgleichen. Erstens verwirrt mich die Invariante Nr. 2, da sie nicht für Zwischenzustände gilt, wie Sie sie beschreiben. Zweitens, was machen Sie, wenn Elemente entfernt werden?
Raphael
7
Sie haben sich eine Datenstruktur ausgedacht, von der Sie nicht geträumt haben ...
Andrej Bauer
@Raphael Danke für deine Kommentare, ich habe die Definition nach deinen Gedanken verbessert. Ich habe nicht an einen Algorithmus zum Entfernen gedacht, sondern wollte nur überprüfen, ob diese Struktur in der Literatur enthalten ist, bevor ich mehr Zeit darauf verwende (und konnte in Google nichts finden). In deinem ersten Satz kannst du Gott definieren, aber gibt es ihn? :)
pbaren
@Andrej Danke, Englisch ist nicht meine Muttersprache. (Ich denke, es ist auch nicht deins :)
pbaren
3
@Andrej: Die OP war ursprünglich „geträumt mit “, die nicht an Sicherheit grenzender Wahrscheinlichkeit ist , was gemeint war. Ich habe es in "von" anstatt "auf" geändert. Beide sind grammatikalisch korrekt, aber beide ändern auch die Bedeutung. "Of" war die interessanter klingende Option ...
András Salamon

Antworten:

31

Sie beschreiben die klassische logarithmische Bentley-Saxe-Methode , die auf statisch sortierte Arrays angewendet wird. Dieselbe Idee kann verwendet werden, um die Unterstützung für Einfügungen in eine statische Datenstruktur (keine Einfügungen oder Löschungen) für ein zersetzbares Suchproblem hinzuzufügen. (Ein Suchproblem ist zerlegbar, wenn die Antwort für eine Vereinigung leicht aus den Antworten für die Mengen A und B berechnet werden kann .) Die Transformation erhöht die amortisierte Abfragezeit um den Faktor O ( log n ) (sofern dies nicht der Fall war) schon größer als ein Polynom in nEINBEINBO(Logn)n), erhöht aber den Platz nur um einen konstanten Faktor. Ja, dank Overmars und van Leeuwen kann es abgeschafft werden, aber das wollen Sie wirklich nicht, wenn Sie es nicht müssen.

Diese Hinweise behandeln die Grundlagen.

Cache-ahnungslose Lookahead-Arrays sind die mutierten Nachkommen von Bentley-Saxe- und van Emde Boas-Bäumen auf Steroiden.

Jeffε
quelle
4
Das sind wunderschön geschriebene und illustrierte Notizen, und ich habe sie oft als Referenz verwendet. Vielen Dank für die Bereitstellung!
Jbapple
Ich sehe, wie Shuttle-Bäume (aus der ersten Hälfte des Artikels, in dem Cache-ahnungslose Lookahead-Arrays vorgestellt werden) mit vEB-Bäumen zusammenhängen, aber in welcher Beziehung stehen COLAs und vEB-Bäume zueinander?
Jbapple
2
Vielen Dank, dieses Material scheint eine sehr interessante Verallgemeinerung der Idee zu sein. Ich habe immer gedacht, dass Datenstrukturen eingefrorene Algorithmen sind, die Sie Schritt für Schritt ausführen können, aber ich hatte nie eine nützliche Formalisierung dieser Intuition gefunden.
Pbaren
Hat der erste Link für jemand anderen funktioniert?
AT
Ja, ich habe es gerade versucht. (Leider geht es zu einer Elsevier Paywall; sorry!)
Jeffs
11

Dies ähnelt einer logarithmisch strukturierten Zusammenführungsstruktur oder einem Cache für nicht bekannte Lookahead-Arrays (oder COLAs).

2k-12ich0ich<k

2021

O(lgn)O(n)O(lg2n)

Apfel
quelle