Angenommen, ich habe n Liniensegmente in der allgemeinen Position. Wie kann ich schnell für jedes meiner n Segmente zählen, wie viele der anderen n-1 es schneidet?Gibt es eine effiziente Möglichkeit, die Anzahl der Schnittpunkte in einer gegebenen Gruppe von Liniensegmenten zu zählen?
Ich kann dies naiv in O (n) Zeit tun. Ich kann alle Schnittpunkte mit einem ziemlich einfachen Sweepline-Algorithmus (Bentley-Ottmann) in der Zeit O ((n + k) log n) finden, wobei k die Anzahl solcher Schnittpunkte ist, und dann die Schnittpunkte, die ich gefunden habe, zu einem Haufen zusammenfassen zählt.
Ich brauche nicht finden Sie die die Kreuzungen, obwohl; Ich möchte nur wissen, wie viele es sind. Ich sehe nicht, wie man den Sweep-Line-Algorithmus ändert, um schneller zu sein, da er für jeden Schnittpunkt zwei Dinge in einem Baum neu anordnen muss, und ich kann mir keine anderen Techniken vorstellen, die nicht an demselben Problem leiden.
Ich bin auch interessiert zu hören, wie man zählt, wie viele totale Kreuzungen es gibt.
Ich habe ... weniger eine harte Zeit zu glauben, dass die Sweep-Line-Methode geschlagen werden kann. Beachten Sie, dass ich die Anzahl der Schnittpunkte zwischen n Liniensegmenten zählen kann, deren linke Endpunkte alle x-Koordinate 0 und deren rechte Endpunkte alle x-Koordinate 1 haben; Das ist nur das klassische Problem, Inversionen in einem Array zu zählen. Also, zumindest in einigen speziellen Fällen, sollte ich in der Lage sein, nach dieser Art von Substruktur zu suchen und sie irgendwie auszunutzen. – tmyklebu
@tmyklebu, sicher, wenn es eine ausnutzbare Unterstruktur gibt, können Sie es leicht ausnutzen. Aber du musst es zuerst wissen. Du könntest leicht nach dem Einheitsquadrat-Fall suchen, in "O (n)", aber es wäre albern, wenn du keinen guten Grund hättest zu glauben, dass es wahrscheinlich ist. (Und ähnlich für andere spezielle Fälle, wie eine Sammlung von konvexen Polygonen.) Solche Fälle sind nicht "der allgemeine Fall". B-O wird die Sammlung von Polygon-Fällen gut behandeln, da es mit weniger tatsächlichen Kreuzungen beschleunigt wird. – rici
B-O behandelt den Fall, in dem nur wenige Schnittpunkte vorhanden sind. Ich kann immer noch mit groben Fällen kommen, wenn ich eine Reihe von Polygonen habe (stelle eine ganze Reihe gleichseitiger Dreiecke dar, die an derselben Stelle zentriert sind, aber von zufälligen Winkeln gedreht werden). Nutzbare Substrukturen sind ... der Punkt der Frage. :) Es gibt einen Artikel von Chazelle ("Segmentabschnitte mit Berichten und Zählungen"), der diese vertikale Dekompositionsidee zu verwenden scheint und einen O (n) Zeitalgorithmus für mein Problem zu haben scheint, aber er scheint sich auf einen sehr zu verlassen unpraktische Datenstruktur. Besser als nichts. – tmyklebu