Par de pontos mais próximo entre dois sets, em 2D


11

Eu tenho dois conjuntos de pontos no plano bidimensional. Quero encontrar o par mais próximo de pontos s , t tal que s ∈ S , t ∈ T , e a distância euclidiana entre s , t é a menor possível. Com que eficiência isso pode ser feito? Isso pode ser feito no tempo O ( n log n ) , onde n = | S | + | T | ?S,Ts,ts∈St∈Ts,tO(nlog⁡n)n=|S|+|T|

Eu sei que se eu sou dado um único conjunto , então é possível encontrar o par mais próximo de pontos s , s ' ∈ S em O ( n log n ) tempo usando um algoritmo de divisão e conquista padrão . No entanto, esse algoritmo não parece generalizar para o caso de dois conjuntos, porque não há conexão entre a distância entre os dois pontos mais próximos dentro de S ou T versus a distância entre os dois pontos mais próximos entre esses conjuntos.Ss,s′∈SO(nlog⁡n)ST

Pensei em armazenar o conjunto em uma árvore k- d, depois para cada s ∈ S , usando uma consulta do vizinho mais próximo para encontrar o ponto mais próximo em T para s . No entanto, o pior caso de execução disso pode ser tão ruim quanto o tempo O ( n 2 ) . Há resultados dizendo que, se os pontos de T são distribuídos aleatoriamente, o tempo de execução esperado para cada consulta é O ( log n ) ; portanto, obteríamos um algoritmo com o tempo de execução esperado O ( n log n )Tks∈STsO(n2)TO(log⁡n)O(nlog⁡n) se tivéssemos a garantia de que os pontos são distribuídos aleatoriamente - mas estou procurando um algoritmo que funcione para qualquer coleção de pontos (não necessariamente distribuídos aleatoriamente).

Motivação: Um algoritmo eficiente seria útil para essa outra questão .

Respostas:


10

Sim, pode ser horário O ( n log n ) . Construir um diagrama de Voronoi para T . Então, para cada ponto s ∈ S , encontre em qual célula do diagrama de Voronoi ela se encontra. O centro dessa célula é o ponto t ∈ T que está mais próximo de s .O(nlog⁡n)Ts∈St∈Ts

Você pode criar um diagrama de Voronoi no tempo , e cada consulta (encontre a célula que contém s ) pode ser feita no tempo O ( log n ) , portanto, o tempo total de execução é o tempo O ( n log n ) .O(nlog⁡n)sO(log⁡n)O(nlog⁡n)


Bom, muito mais simples do que eu poderia criar :).
— Aelguindy 5/11

Boa abordagem! Os links ajudariam, especialmente para o lado da consulta. Eu poderia encontrar uma página da Wikipedia mostrando que o problema geral de localização de pontos pode ser resolvido no tempo , mas existe uma maneira melhor para o caso especial das células Voronoi? Minha pesquisa apenas encontrou essa resposta , que faz da maneira O ( n ) . O(log⁡n)O(n)
— Jrandom_hacker 5/11

Tn=|S|+|T|O(n)

1
nO(n)≤6n

Isso parece correto a partir desta pergunta em math.stackexchange.
— Albjenow 29/11/19

5

L1

dO(nlogd−1⁡n)

O(nlog⁡n)O(nlog2⁡n)

S,TS−δzTδzzδzδz


P2pmPPqmQQ

1
l

O link está quebrado :(
— Keerthana Gopalakrishnan
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.