Dado dois conjuntos e cada um contendo pontos disjuntos no plano, calcule a menor distância entre um ponto em e um ponto em , ou seja, .
Não tenho certeza se estou certo, mas esse problema é muito semelhante aos problemas que podem ser resolvidos pela programação linear em geometria computacional. No entanto, a redução para LP não é direta. Também meu problema parece relacionado a encontrar o ponto mais fino entre dois conjuntos de pontos que obviamente podem ser resolvidos por LP em no espaço bidimensional.
Respostas:
Eu tenho uma solução que pode parecer um pouco complicada, mas deve ser mais eficiente do que a pesquisa de força bruta ingênua :O(n2)
O restante está em pseudocódigo para deixar mais claro:
Ou seja, ao pré-classificar os pontos ao longo de , é possível filtrar os pares que nunca estarão dentro de pois ao longo de sempre será.dv d v ≤ ″ b k - a j ″bk−aj v ≤∥bk−aj∥
No pior caso, ainda é , mas se e estiverem bem separados, deve ser muito mais rápido que isso, mas não melhor que , que é necessário para a classificação.A B O ( n log n )O(n2) A B O(nlogn)
Atualizar
Esta solução não é de forma alguma tirada do chapéu. É um caso especial do que uso nas simulações de partículas para encontrar todos os pares de partículas que interagem com o bineamento espacial. Meu próprio trabalho explicando o problema mais geral está aqui .
Quanto à sugestão de usar um algoritmo de varredura de linha modificado, embora intuitivamente simples, não estou convencido de que isso esteja em quando conjuntos disjuntos são considerados. O mesmo vale para o algoritmo aleatório de Rabin.O(nlogn)
Parece não haver muita literatura lidando com o problema do par mais próximo em conjuntos disjuntos, mas descobri isso , que não reivindica ser inferior a , e isso , que não parece para fazer qualquer reclamação sobre qualquer coisa.O(n2)
O algoritmo acima pode ser visto como uma variante da varredura de avião sugerida no primeiro artigo (Shan, Zhang e Salzberg), mas, em vez de usar o eixo- e sem classificação, o eixo entre os conjuntos é usado e os conjuntos são percorridos em ordem decrescente / crescente.x
fonte
Você pode adaptar o algoritmo de varredura de linhas do "par mais próximo" , que é .O(nlogn)
A única alteração que você precisará fazer é ignorar os pares que pertencem ao mesmo conjunto.
Edit: Na verdade, isso não é simples (ou até possível) como eu descrevi. Veja os comentários para discussão.
fonte
A idéia em problemas como esse é criar uma estrutura ordenada a partir de um dos conjuntos que permita consultas eficientes do vizinho mais próximo. O artigo clássico que apresentou uma estrutura de consulta O (log n) para dimensão arbitrária foi:
Shamos e Hoey em soluções Voronoi
Desde então, várias outras partições espaciais baseadas em idéias dos mosaicos de Delauney foram criadas e também se traduzem em uma variedade de descrições de varredura do subespaço. Observe que o método Voronoi também se enquadra na descrição geral de dividir e conquistar devido ao seu particionamento plano que faz a etapa de construção O (n log n).
Portanto, a solução básica para esse problema é:
Como é possível observar a complexidade de cada etapa, a complexidade total é O (n log n). Para o leitor moderno que não procura artigos clássicos, isso é abordado em muitos livros de algoritmos, por exemplo, "The Algorithm Design Manual" de Skiena.
fonte
O limite inferior para esse problema é no modelo de árvore de decisão algébrica. Vou dar um esboço da sua prova aqui.O(n∗logn)
Reduziremos a instância do problema de distinção de elemento E para C.
Sabemos que o limite inferior no tempo de execução para decidir o problema de distinção de elemento é . Portanto, por redução, o limite inferior também se aplica ao nosso problema.O(n∗logn)
fonte