Use a abordagem de particionamento de espaço para procurar vizinhos mais próximos .
Por exemplo, uma abordagem é usar um k-d árvore na superfície da esfera. Você pode expressar todos os pontos da esfera usando coordenadas esféricas : cada ponto da esfera tem coordenadas(1,θ,ϕ). Assim, temos um espaço bidimensional com coordenadas(θ,ϕ). Agora organize seus pontos usando umk-d tree, onde estamos aqui k=2dimensões. Existem algoritmos padrão para a pesquisa de vizinhos mais próximos em umk-d árvore; heuristicamente, o tempo de execução esperado éO(lgN).
Você precisará fazer pequenas modificações na estrutura de dados para refletir que as coordenadas "envolvem" o módulo 2π, mas isso não é difícil. A sub-rotina principal usada na pesquisa de vizinhos mais próximos em umk-d árvore é: dado um ponto P e uma região "retangular" R, encontre a distância de P para o ponto mais próximo R. No seu caso, a regiãoR é [θℓ,θu]×[ϕℓ,ϕu], ou seja, o conjunto de pontos {(1,θ,ϕ):θℓ≤θ≤θu,ϕℓ≤ϕ≤ϕu}. É fácil calcular a distância entreP para o ponto mais próximo R. Isso permitirá que você use o algoritmo padrão para a pesquisa de vizinhos mais próximos em umk-d árvore.
Como alternativa, em vez de um k-d tree, você pode usar qualquer outra árvore de particionamento de espaço binário ou pode olhar para árvores métricas , embora eu não tenha nenhum motivo para esperar que elas sejam significativamente melhores.