Betrachten Sie das folgende Problem:
Sei eine Konstante. Wir erhalten ein -ary-Array von und . Sei .
Wir möchten eine Datenstruktur erstellen, indem wir vorverarbeiten , um die folgenden Arten von Abfrageoperationen auszuführen:
- Gibt es angesichts der Koordinaten einer -ary-Box eine in der Box?
- Geben Sie anhand der Koordinaten einer -ary-Box die Position einer in der Box zurück (falls vorhanden).
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.
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 ist 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.
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.
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).
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.
Antworten:
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.
quelle