J'ai une solution qui peut sembler un peu compliquée, mais qui devrait être plus efficace que la recherche par force brute naïve :O(n2)
- laissez être l'axe entre les centres de masse de et .A BvAB
- Triez les points en et long de cet axe respectivement dans l'ordre décroissant et croissant, ce qui donne les séquences , , ..., et , , ..., .B a 0 a 1 a n b 0 b 1 b nABa0a1anb0b1bn
Le reste est en pseudo-code pour le rendre plus clair:
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
Autrement dit, en pré-triant les points le long de , vous pouvez filtrer les paires qui ne seront jamais à l'intérieur de de l'autre puisque long de sera toujours.d b k - a j v ≤ ‖ b k - a j ‖vdbk−ajv≤∥bk−aj∥
Dans le pire des cas, c'est toujours , mais si et sont bien séparés, cela devrait être beaucoup plus rapide que cela, mais pas mieux que , ce qui est nécessaire pour le tri.O(n2)ABO(nlogn)
Mise à jour
Cette solution n'est nullement sortie d'un chapeau. C'est un cas particulier de ce que j'utilise dans les simulations de particules pour trouver toutes les paires de particules en interaction avec le binning spatial. Mon propre travail expliquant le problème plus général est ici .
Quant à la suggestion d'utiliser un algorithme de balayage de ligne modifié, bien que intuitivement simple, je ne suis pas convaincu que ce soit dans lorsque des ensembles disjoints sont considérés. Il en va de même pour l'algorithme randomisé de Rabin.O(nlogn)
Il ne semble pas y avoir beaucoup de littérature traitant du problème de paire la plus proche dans disjoints, mais je l' ai trouvé ce qui ne prétend pas à être sous , et ce qui ne semble pas pour faire des réclamations sur quoi que ce soit.O(n2)
L'algorithme ci-dessus peut être vu comme une variante du balayage plan suggéré dans le premier article (Shan, Zhang et Salzberg), mais au lieu d'utiliser l' axe et aucun tri, l'axe entre les ensembles est utilisé et les ensembles sont traversés dans l'ordre décroissant / croissant.x