Abdeckungsproblem (Sender und Empfänger)

14

Ich versuche das folgende Abdeckungsproblem zu lösen.

Es gibt n Sender mit einer Reichweite von 1 km und n Empfänger. Entscheiden Sie in O(nlogn) dass alle Empfänger von einem Sender abgedeckt werden. Alle Empfänger und Sender werden durch ihre x und y Koordinaten dargestellt.

Die fortschrittlichste Lösung, mit der ich kommen kann, ist O(n2logn) . Sortieren Sie für jeden Empfänger alle Sender nach der Entfernung zu diesem aktuellen Empfänger. Nehmen Sie dann den Sender mit der kürzesten Entfernung und diese kürzeste Entfernung sollte innerhalb von 0,5 km liegen.

Aber der naive Ansatz sieht in der Zeitkomplexität viel besser aus . Berechnen Sie einfach den gesamten Abstand zwischen allen Paaren von Sender und Empfänger.O(n2)

Ich bin nicht sicher, ob ich bei diesem Problem Algorithmen für die Bereichssuche anwenden kann. Zum Beispiel erlauben uns kd-Bäume, solche Bereiche zu finden, aber ich habe nie ein Beispiel gesehen und bin mir nicht sicher, ob es eine Art von Bereichssuche für Kreise gibt.

Die gegebene Komplexität setzt voraus, dass die Lösung der Sortierung ähnlich sein sollte.O(nlogn)

com
quelle
1
Wenn die erwartete Zeit in Ordnung ist, könnten Sie einen k d -Baum über den Sendern erstellen (Zeit O ( n log n ) ) und dann für jeden Empfänger eine Abfrage nach dem nächsten Nachbarn durchführen (Durchschnittswert) von O ( log n ) Zeit für jeden Empfänger). Dies sollte der Trick sein, aber ich gehe davon aus, dass Sie die Komplexität im schlimmsten Fall benötigen. Es scheint einige Tricks für die Beschleunigung zu geben, wenn Sie mehrere Abfragen nach dem nächsten Nachbarn in einem k d -Baum ausführen. O(nlogn)kdO(nlogn)O(logn)kd
utdiscant
1
Ich denke, ein Sweep-Line-Algorithmus kann den Trick machen: Sortieren Sie Sender und Empfänger nach x-Koordinaten und gehen Sie die Liste schrittweise durch. Eine geschickte Verwaltung des Satzes funktionsfähiger Sender ist unerlässlich.
Raphael
@Raphael, kannst du bitte etwas näher darauf eingehen? Es sieht so aus, als ob es im schlimmsten Fall sehr langsam wird.
com
1
Ich denke, es lohnt sich, einen Blick auf Fortunes Algorithmus zur Berechnung eines Voronoi-Diagramms in der Ebene zu werfen . Es funktioniert in und mit einem Voronoi-Diagramm wird Ihr Problem einfach. O(nlogn)
Syzygy

Antworten:

4

Sie können das Voronoi-Diagramm zusammen mit der Datenstruktur von Kirkpatrick verwenden, um dieses Problem zu lösen.

Wie Raphael und Syzygy vorgeschlagen haben, können Sie den Fortune-Algorithmus (Sweepline) verwenden , um das Voronoi-Diagramm zu erstellen. Zeit im schlimmsten Fall: .O(nlogn)

Das Voronoi-Diagramm enthält eine Reihe von Polygonen, die jeweils einen Sender enthalten. Jeder Punkt innerhalb des Polygons ist dem Sender am nächsten. Wenn Sie also herausfinden können, welches Polygon den Empfänger enthält, können Sie den nächstgelegenen Sender finden, indem Sie irgendwie herausfinden, in welchem ​​Polygon es sich befindet. Danach prüfen Sie, ob sich dieser Sender innerhalb von .1 km

Um festzustellen, welches Voronoi-Polygon den Empfänger enthält, triangulieren Sie zunächst jedes Polygon im Diagramm. Jetzt haben Sie ein Dreiecksnetz. Als Nächstes verwenden Sie die Datenstruktur von Kirkpatrick, um ein beliebiges Dreieck zu lokalisieren, das einen bestimmten Punkt in der Zeit , im schlimmsten Fall. Der Aufbau der Kirkpatrick-Datenstruktur erfordert den ungünstigsten Fall O ( n log n ) . Sobald Sie das Dreieck kennen, kennen Sie das Polygon, das es enthält, und damit den nächsten Sender. Wenn Sie dies für alle Empfänger tun, ist dies im schlimmsten Fall O ( n log n ) .O(logn)O(nlogn)O(nlogn)

Jede Zelle in einem Voronoi-Diagramm ist ein konvexes Polygon, möglicherweise unbegrenzt.

...

Die Anzahl der Eckpunkte [eines Voronoi-Diagramms von n Stellen] V ≤ 2n-5

- www.cs.arizona.edu

Θ(v)vnnO(n)O(n) , aber die gesamte Triangulation nimmt auch O ( n ) an . (Grundsätzlich werden wir nicht viele Zellen mit O ( n ) -Seitenantreffen, dies würde zu viele Dreiecke für einen planaren Graphen ergeben.)O(n)O(n)O(n)

Realz Slaw
quelle