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,tsStTs,tO(nlogn)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,sSO(nlogn)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 )TksSTsO(n2)TO(logn)O(nlogn) 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 .

DW
fonte

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(nlogn)TsStTs

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(nlogn)sO(logn)O(nlogn)

DW
fonte
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(logn)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(nlogd1n)

O(nlogn)O(nlog2n)

S,TSδzTδzzδzδz

aelguindy
fonte
P2pmPPqmQQ
1
l
O link está quebrado :(
Keerthana Gopalakrishnan