Distância mais curta entre um ponto em A e um ponto em B

9

Dado dois conjuntos A e B cada um contendo n pontos disjuntos no plano, calcule a menor distância entre um ponto em A e um ponto em B , ou seja, min { dist(p,q) | pAqB } .

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 O(n) no espaço bidimensional.

com
fonte
4
Qual é a pergunta aqui?
Raphael
Não sou especialista, mas geralmente em aprendizado de máquina, onde esses pontos são dados, os conjuntos se comportam bem na maioria das vezes e são agrupados, portanto algoritmos como o sugerido pelo @Pedro funcionam bem.
chazisop
3
"que obviamente pode ser resolvido por LP em O (n) no espaço bidimensional" - pergunto-me o que motivou essa afirmação. "Programação linear" geralmente não é solucionável em tempo linear; o "linear" refere-se a outra coisa. Então, o LP tem uma forma especial?
Raphael

Respostas:

5

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)

  1. deixar que ser o eixo entre os centros de massa de e .A BvAB
  2. Classifique os pontos em e ao longo deste eixo em ordem decrescente e crescente, respectivamente, resultando nas seqüências , , ..., e , , ..., .B a 0 a 1 a n b 0 b 1 b nABa0a1anb0b1bn

O restante está em pseudocódigo para deixar mais claro:

d = infinity.
for j from 1 to n
    if (b_1 - a_j) along v > d then break endif
    for k from 1 to n
        if (b_k - a_j) along v > d then
            break
        else
            d = min( d , ||b_k - a_j|| )
        endif
    enddo
enddo

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á.dvd v b k - a jbkajvbkaj

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)ABO(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

Pedro
fonte
2
@ Pedro: Desculpe, não comentei antes (sem tempo no momento). A razão pela qual eu votei sua resposta como negativa foi porque era uma resposta ruim e não deveria estar no topo. Este é realmente um problema bem conhecido em geometria computacional com o pior caso O (n log n). Uma boa resposta teria apontado o problema conhecido (talvez com uma referência) e as soluções comuns, que incluem: usar árvores kd e testar elementos, algoritmos de varredura etc. A idéia geral deve ser o pré-processamento em uma estrutura ordenada e usar esse . Veja o caso 1D - O mais óbvio (n log n) lá.
ex0du5
2
@ ex0du5: Parece que você deve postar sua própria resposta! Observe que "existe uma resposta melhor" geralmente não é uma boa razão para a votação decrescente; essa medida deve ser reservada para respostas erradas, spam e muito mal formatadas. O de Pedro também não é. Veja também aqui para ter uma impressão de quanto algumas pessoas pensam que devem ser dadas antes de um voto negativo.
Raphael
11
@ Rafael: Eu não respondi porque havia uma resposta justa e não tive tempo para procurar referências. Quanto à sua referência sobre como fazer um voto negativo, esse é um algoritmo horrível para esses sites! Especialmente os estudantes de CS devem entender a importância de não perder o objetivo do formalismo. O objetivo da votação é mover as respostas para um ranking que guie os alunos posteriores do mesmo problema para as respostas mais úteis. Meu algoritmo de votação faz isso. Esse algo: obviamente não. Isso pode ser discutido em uma meta, se você quiser, mas como adultos, devemos usar nossos poderes para o bem, eu acho.
Ex0du5
11
@ ex0du5: Você parece ter algum tempo em suas mãos agora. Você pode realmente mostrar que esta instância é realmente um "problema conhecido com o pior caso "? O(nlogn)
Pedro Pedro
11
@ ex0du5: Na verdade, a pesquisa de vizinhos mais próximos, por exemplo, usando árvores kd , possui apenas complexidade média O (logn) . Então, estamos de volta à estaca zero.
Pedro
4

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.

Artium
fonte
2
Apenas uma observação, também é possível adaptar o algoritmo clássico de dividir e conquistar para pares mais próximos, que também roda em ; veja também Wikipedia . O(nlogn)
rizwanhudda
11
Para um algoritmo de tempo linear aleatório, veja, por exemplo, Rabin vira uma moeda no blog de Lipton.
Juho
3
Você poderia ser um pouco mais específico sobre como implementaria isso para conjuntos disjuntos, especialmente no que diz respeito à manutenção do ligado? O(nlogn)
Pedro Pedro
-1 por incorreto. O algoritmo de pareamento de linha de par mais próximo que você vincula depende do conjunto classificado que contém elementos , mas, no caso de conjuntos disjuntos, esse conjunto começa contendo elementos; portanto, não está mais em , em pelo menos não no pior caso. n O ( n log n )O(1)nO(nlogn)
Pedro Pedro
11
@ Pedro: Por que seria maior? Se houver, o conjunto de pontos candidatos atuais deve diminuir.
Raphael
4

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 é:

  1. Pegue o conjunto A e crie a eficiente estrutura de consulta do Vizinho Mais Próximo de sua escolha. Este passo da construção é O (n log n) [veja o teorema 4].
  2. Para cada elemento em B, consulte a estrutura A para o vizinho mais próximo. Cada consulta é O (log n) [consulte o teorema 15, dimensão fixa]; portanto, o tempo total de consulta para todos os pontos em B é O (n log n).
  3. Quando o resultado do ponto mais próximo de A para cada B for recuperado, coloque-o em uma estrutura ordenada à distância. Este é O (log n) insira cada resultado ou O (n log n) para todos.
  4. Quando todos os B foram examinados, você pode rapidamente (O (1)) obter o ponto B na estrutura ordenada com a menor distância vizinha até um ponto em A.

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.

ex0du5
fonte
11
"A solução da Artium, por exemplo, pode ser escrita desta forma e é completamente válida." - bem, o que você propõe aqui não é mais um algoritmo de linha de varredura (puro), então não sei sobre isso.
Raphael
@ Rafael: Claro que é. Os algoritmos de sweepline pré-processam os pontos em uma estrutura ordenada, conforme descrito aqui. Eu até vinculei o algoritmo da Fortune sob sua resposta, que mostra que o algoritmo do sweepline é apenas uma instância do algoritmo de Voronoi. A razão pela qual mantive a solução genérica para a estrutura de consulta é porque há um grande número de mecanismos geométricos que foram desenvolvidos para isso.
Ex0du5
Você não precisa de uma ordem específica enquanto itera sobre , enquanto a ordem é essencial para algoritmos de varredura (muitos / todos?) (Por isso o nome, eu acho). B
Raphael
1

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 no espaço bidimensional.

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

Reduziremos a instância do problema de distinção de elemento E para C.

  • Insira E: S={a1,a2,a3,...,an}
  • Seja > 0 uma pequena fraçãoϵ
  • A = ,B = { ( a i + ϵ ) : 1 i n }{(ai,0):1in}B={(ai+ϵ):1in}
  • Agora, se pudermos encontrar a menor distância (d) entre os conjuntos A e B. Podemos decidir o problema da distinção do elemento em tempo como a seguir O(n)
    • O conjunto tem uma duplicata se e somente se d =ϵSϵ

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

rizwanhudda
fonte