Verwenden Sie den Raumpartitionierungsansatz für die Suche nach nächsten Nachbarn .
Ein Ansatz ist beispielsweise die Verwendung von a k-d Baum auf der Oberfläche der Kugel. Sie können jeden Punkt auf der Kugel mit sphärischen Koordinaten ausdrücken : Jeder Punkt auf der Kugel hat Koordinaten( 1 , θ , ϕ ). Wir haben also einen zweidimensionalen Raum mit Koordinaten( θ , ϕ ). Organisieren Sie nun Ihre Punkte mit ak-d Baum, wo wir hier sind k = 2Maße. Es gibt Standardalgorithmen für die Suche nach dem nächsten Nachbarn in ak-d Baum; heuristisch ist die erwartete LaufzeitO ( lgN.).
Sie müssen kleine Änderungen an der Datenstruktur vornehmen, um zu berücksichtigen, dass die Koordinaten modulo "umlaufen" 2 π, aber das ist nicht schwer. Die Schlüsselunterroutine, die bei der Suche nach dem nächsten Nachbarn in a verwendet wirdk-d Baum ist: gegeben einen Punkt P. und einen "rechteckigen" Bereich R., finde die Entfernung von P. zum nächsten Punkt in R.. In Ihrem Fall die RegionR. ist [θℓ,θu] × [ϕℓ,ϕu]]dh die Menge der Punkte { ( 1 , θ , ϕ ) :θℓ≤ θ ≤θu,ϕℓ≤ ϕ ≤ϕu}}. Es ist einfach, die Entfernung von zu berechnenP. zum nächsten Punkt in R.. Auf diese Weise können Sie den Standardalgorithmus für die Suche nach dem nächsten Nachbarn in a verwendenk-d Baum.
Alternativ anstelle von a k-d Baum, Sie könnten jeden anderen Binärraum-Partitionierungsbaum verwenden oder sich metrische Bäume ansehen , obwohl ich keinen Grund habe zu erwarten, dass sie wesentlich besser sind.