Gegeben eine Reihe von Intervalle auf einer Linie gibt es eine Algorithmus zum Finden von Intervallen, die in anderen Intervallen enthalten sind (z. B. Manber, "Using Induction to Design Algorithms", 1988). Gibt es ein Algorithmus für achsenausgerichtete Rechtecke in höheren Dimensionen?
Ich habe im Internet gesucht und versucht, selbst darüber nachzudenken, konnte aber keine Verallgemeinerung für höhere Dimensionen finden. Zum Beispiel gegeben Bei achsenausgerichteten Rechtecken in der Ebene besteht die Aufgabe darin, herauszufinden, welche Rechtecke in anderen Rechtecken enthalten sind.
algorithms
computational-geometry
John Donn
quelle
quelle
Antworten:
Haben Sie mehrdimensionale Indizes berücksichtigt? Sie sind normalerweise sehr effizient, um überlappende oder eingeschlossene Rechtecke zu finden.
Ich persönlich habe eine Art Präfix-Sharing-Binärquadtree geschrieben: Java-Quellen Es gibt eine API für Rechtecke mit einer speziellen Methode zum Suchen von Rechtecken, die in einem anderen Rechteck enthalten sind :
PhTreeSolidF.queryInclude()
.Ich bin mir nicht sicher, wie komplex es ist, aber es liegt ungefähr in der Größenordnung von O (n * k * log n), den Baum und O (k * log n) für jede Abfrage zu erstellen (k ist die Anzahl der Dimensionen). Bei stark gruppierten Datensätzen kann es sogar zu einem Verlust von O (1) für jede Abfrage kommen (ich habe dies mit n = 10.000.000 und 2 <= k <= 15 getestet).
quelle
Es gibt eine natürliche Erweiterung / Verallgemeinerung des Bereichs, der nach achsenausgerichteten Rechtecken und höherdimensionalen Hyperwürfeln sucht.
Das Problem reduziert sich darauf, den Bereichseinschluss auf jeder Achse separat zu überprüfen und dann den Schnittpunkt der Rechtecke oder Hyperwürfel zu finden, die jeden 1-d-Bereichseinschluss "besitzen". Es dauert k * O (f (n)), wobei f (n) die Zeit ist, um eine einzelne Dimension zu überprüfen, und k die Anzahl der Dimensionen ist. Dies basiert auf der einfachen Idee, dass sich bei achsenausgerichteten Rechtecken / Hyperwürfeln ein Hyperwürfel in einem anderen Hyperwürfel befindet, wenn sich auch alle seine separaten Seiten befinden. Dies bestimmt nicht nur überlappende achsenausgerichtete Rechtecke / Hyperwürfel, obwohl ein ähnlicher Algorithmus dies kann.
Ich bin mir dessen in der Literatur nicht bewusst, aber es ist nicht komplex und vermutlich wird es zumindest nebenbei irgendwo zitiert. Die Literatur zu diesem Thema arbeitet im Allgemeinen mit Kd-Bäumen oder Quadtrees (2. Fall) und fällt in die allgemeine Kategorie der Datenbankbereichsabfrage / -suche . Der Ansatz dort wäre im Allgemeinen, die Definition allgemeiner geometrischer Objekte wie Polygone zu ermöglichen und dann alle Knoten im Kd zu finden, mit denen sich das Polygon überlappt, und die Bereichsberechnung über alle Knoten des Polygons (der Polygone) durchzuführen, um Schnittpunkte zu bestimmen.
quelle