Dado um conjunto finito de pontos em , como podemos calcular eficientemente um "ponto mais isolado" ?
Definimos um "ponto mais isolado" por
(Usei a notação , mesmo que não seja necessariamente única. Aqui indica a distância euclidiana.) Portanto, em outras palavras, estamos procurando um ponto com a maior distância para o vizinho mais próximo.
Um algoritmo ingênuo estaria computando todas as distâncias aos pares, encontrando o vizinho com a menor distância para cada ponto e, em seguida, encontrando o máximo deles. São operações , mas podemos fazer melhor que isso?
Respostas:
Use qualquer algoritmo para todos os vizinhos mais próximos ; então você pode resolver trivialmente seu problema. Esse algoritmo encontra, para cada ponto de dados, seu vizinho mais próximo. O ponto mais isolado é aquele cujo vizinho mais próximo está mais distante; portanto, depois de resolver todos os vizinhos mais próximos, você pode encontrar o ponto mais isolado com uma simples varredura linear.
Aparentemente, todos os vizinhos mais próximos podem ser encontrados no tempo ; veja as referências na Wikipedia. Ou, se você quiser algo para implementar, escolha qualquer estrutura de dados para os vizinhos mais próximos e, para cada ponto , encontre o vizinho mais próximo.O(nlogn) p
fonte
Conforme sugerido nos comentários, eu pesquisaria as consultas de vizinhos mais próximos.
Fazer uma consulta NN por ponto deve estar na ordem de portanto já é melhor que a solução ingênua.O(n∗log(n))
Você pode melhorar ainda mais isso adicionando um parâmetro à consulta NN que contém a distância vizinha mais próxima do ponto mais isolado que você encontrou até agora. Você pode abortar qualquer consulta NN assim que encontrar um ponto mais próximo que . Isso deve acelerar bastante a sua pesquisa.dmax dmax
Btw, as pessoas geralmente sugerem KD-Trees para NN-Search. As árvores KD são muito fáceis de implementar, mas, na minha experiência, escalam consistentemente menos bem com dimensões mais altas do que outras árvores. Para ou mais, eu recomendaria usar uma R-Tree, como R * Tree (R-Star-Tree), X-Tree ou R-Tree carregada por STR ou uma PH-Tree (que é mais parecida com uma quadtree bit a bit).d>10
fonte