Bitkomplexität der O (1) -Zeitbereichsabfrage in einem


8

Betrachten Sie das folgende Problem:

Sei eine Konstante. Wir erhalten ein -ary-Array von und . Sei .kkAd1××dk01N=i=1kdi

Wir möchten eine Datenstruktur erstellen, indem wir vorverarbeiten , um die folgenden Arten von Abfrageoperationen auszuführen:A

  1. Gibt es angesichts der Koordinaten einer -ary-Box eine in der Box? kD1
  2. Geben Sie anhand der Koordinaten einer -ary-Box die Position einer in der Box zurück (falls vorhanden).kD1

Die Operationen müssen in konstanter Zeit . Die zeitliche Komplexität wird auf einem RAM-Computer gemessen. Die Vorverarbeitungszeit und der Raum für die Datenstruktur sind für uns nicht wichtig.O(1)

Die Frage ist, wie viel Speicherplatz (in Bit-Komplexität) wir benötigen, um eine Datenstruktur zu speichern, die die oben genannten Operationen ermöglicht.

Die triviale Untergrenze istN Bits, da das Array für diese Abfragen rekonstruiert werden kann (daher sollte die Datenstruktur mindestens die gleiche Informationsmenge enthalten).

Die triviale Obergrenze besteht darin, die Antwort auf alle Fragen zu speichern. Das würde Bits benötigen . Wir vermuten jedoch, dass dies viel effizienter durchgeführt werden kann.i=1k(di2)=Θ(N2)

Betrachten Sie zum Beispiel den Sonderfall mit . In diesem Fall können wir eine prägnante RMQ-Datenstruktur verwenden , um das erste Problem zu lösen, und die Datenstruktur benötigt Bits zum Speichern.k=12N+o(N)

Was ist eine effiziente Datenstruktur für diese Aufgabe?
Wie gering kann die Raumkomplexität (die Anzahl der Bits) sein, um diese Operationen (oder nur die erste Operation) zu unterstützen?

Update (1/15): Im Sonderfall ist die Verwendung von Bits ausreichend (eigentlich besser, , wobei die Zahl 's in ) durch Reduzieren des Problems auf ein Vorgängerproblem und Verwenden der Reduktion vom Vorgängerproblem auf ein vollständig indizierbares Wörterbuch (FID). Siehe " Mehr Eile, weniger Abfall: Verringerung der Redundanz in vollständig indexierbaren Wörterbüchern " von Grossi, Orlandi, Raman und Rao (2009).k=1N+o(N)log(Nt)+O(t)t1A

Update (27.06.): Reduzieren Sie das Problem erneut auf RMQ. Wir verwenden ein dimensionales RMQ von Yuan und Atallah , um eine -Obergrenze für den Platzbedarf zu erhalten, der erforderlich ist, wenn festgelegt ist.kO(nlogn)k


1
Die Frage ist nicht klar: Ist dies eine Datenstrukturfrage? Wenn ja, wie lauten die anderen Operationen auf diesem kD-Array? Wenn es keine andere Operation gibt, ist keine 1 darauf. Wenn die Frage ist, dass wir ein kD-Array erhalten und was wir vorverarbeiten müssen, und es dann so speichern, dass wir wenig Speicher verbrauchen, diese Überprüfungsoperation jedoch im schlimmsten Fall von ausführen können, klären Sie dies. Erklären Sie auch, was das Berechnungsmodell ist, wenn Sie eine Untergrenze wünschen. O(1)
Kaveh


IIUC, das Papier sagt, dass die Antwort für 1D wirklich Bits ist und die Idee ist, alle kleinen Kisten plus alle Kisten mit Längen der Leistung 2 zu speichern, und andere Kisten können von len pow-2-Kisten konstant erhalten werden Zeit ( ) und es scheint mir, dass das gleiche hier funktionieren würde und Bits ausreichen werden. O(nlgn)O(2k)O(nklgkn)
Kaveh

Danke, ich habe einige Klarstellungen hinzugefügt. Hat das Papier nicht gesagt, dass ihr Hauptbeitrag darin besteht, Bits sowohl bei der Vorverarbeitung als auch bei der Speicherung zu verwenden? 2n+o(n)
Chao Xu

Entschuldigung, die, die ich beschrieben habe, stammt aus früheren Arbeiten. Ihr Ergebnis scheint jedoch konzeptionell ähnlich zu sein, dh sie teilen das Array in Blöcke auf, berechnen die Antwort auf sie vor und verwenden eine konstante Anzahl von ihnen, um die Antwort für eine bestimmte zu berechnen. Wenn in kD die Anzahl der Basisblöcke, die man benötigt, um die Antwort auf einen beliebigen Block zu berechnen, eine Konstante ist, würde ein ähnlicher Algorithmus hier funktionieren und wahrscheinlich so etwas wie (habe ich nicht) Überprüfen Sie, ob dies der Fall ist. O(nk)=O(N)
Kaveh

Antworten:


1

Sie können viel mehr Speicherplatz sparen, wenn Sie nur die logarithmische Zeitkomplexität zulassen. Sie können einen kD-Segmentbaum implementieren, der N * 2 ^ k-Bit-Speicher benötigt und für beide Unteraufgaben in logarithmischer Zeitkomplexität und für die Erstellung des Baums in linearer Zeitkomplexität ausgeführt wird.

Wenn Sie unbedingt O (1) wollen, berechnen Sie alles vor.


2
Können Sie skizzieren, wie der Baum in logarithmischer Zeit aufgebaut ist?
Raphael

Entschuldigung, es ist in linearer Zeit gebaut
Bojan Serafimov

2
@BojanSerafimov Dann solltest du die Antwort aktualisieren :) Kommentare werden möglicherweise gelöscht.
Juho

1
Ich denke, dies kann eine gute Antwort sein, wenn Sie es nur so bearbeitet haben, dass es korrekt ist, und vielleicht etwas ausführlicher darüber, wie diese Bäume aussehen und wie Sie sie bauen.
Raphael
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.