Das Problem bei der Hand:Algorithmus für> 2D-Skyline Abfrage/Efficient Frontier
eine Menge von N Punkten in einem D-dimensionalen Raum gegeben, mit allen ihren Koordinaten> = 0 (in 2D die Punkte alle in der sein würden, 1. Quadrant, in 3D im 1. Oktant, und so weiter ...), entfernen Sie alle Punkte, die einen anderen Punkt haben, dessen Wert in jeder Koordinate größer oder gleich ist.
In 2D ist das Ergebnis folgendermaßen aus:
(Bild von Vincent Zoonekynd Antwort here), und es ist ein einfacher Algorithmus, detaillierter in dieser Antwort, die in N*log(N)
läuft. Mit Chunking hätte ich es zu N*log(H)
gebracht haben, aber Optimierungen auf das sind für eine andere Frage.
Ich war daran interessiert, die Lösung auf 3 Dimensionen bei der Verlängerung (und möglicherweise 4, wenn es noch sinnvoll ist), aber mein aktueller 3D-Algorithmus ist ziemlich langsam, umständlich und verallgemeinern nicht auf 4D schön:
- Sortier Punkte auf der x-Achse, mit Anmerkungen versehen, die Position eines jeden Punktes
- eine Art von Segmentbaum mit N Blättern initialisieren, wo Blätter werden die Punkte y-Werte halten, und ein Knoten
max(child1, child2)
- Sortierpunkte auf der z-Achse halten
- Für jeden Punkt von dem größten z:
- prüfen, welche Position sie in der x-Ordnung waren, versuchen Sie es in dem Segmentbaum
- Check in dieser Position an erster Stelle, wenn es ein Punkt bereits nach unten ist (so hat es> z), an einer höheren Stelle (so hat es> x) mit einem größeren y (das kostet log (N), danke Baum)
- Wenn dieser Punkt gefunden wird, wird der aktuelle Punkt verworfen, andernfalls wird er eingefügt und der Baum ist aktualisiert
Dieses Angebot läuft noch in N*log(N)
, aber erfordert 2 verschiedene Sorten und eine 2*N
-große Struktur.
Erweiterung würde erfordern eine andere Art und eine prohibitive 2*N^2
-big Quad-Struktur.
Gibt es effizientere (insbesondere CPU-bezogene) Ansätze?
Ich glaube nicht, es relevant ist, aber ich bin in C schreiben, der Code ist here.
Ich glaube, ich habe Ihr Problem schon einmal kennen gelernt - können Sie gehen durch ein Beispiel dessen, was Sie eigentlich wollen, mit ein paar Punkten für Illustration? –
@DAdams Ich glaube, das Bild erklärt es viel besser als ich kann, nur vorstellen, es in 3D.Sie beginnen mit allen Punkten dort und der Algorithmus gibt Ihnen nur die Quadrate zurück. In 2D ist es einfach zu sehen. – 12345ieee
Bemerkenswert, dass die gleiche Frage für C# gefragt wurde, und die selbe Lösung, die ich vorschlug, wurde angenommen http://stackoverflow.com/questions/12407730/finding -Skyline-Set –