Je dois trouver toutes les paires de points les plus proches dans un plan à partir d'un ensemble donné.
J'ai implémenté avec succès un algorithme naïf O(n²)
similaire à cette fonction pseudo-code, où set
est une liste de tous les points en entrée, count
est le compte de tous les points sur l'entrée, qui retourne dist
qui est la distance minimale trouvée et result
est la liste de toutes les paires de points avec une telle distance.
function naive(Points[] set, int count)
result = []
distance = INF
for i=0 to count-1:
for j=i+1 to count:
newDistance = distance(set[i], set[j])
if newDistance < distance:
result = []
result.append({set[i], set[j]})
else if newDistance == distance:
result.append({set[i], set[j]})
return (dist, result)
Cette solution fonctionne bien, mais elle est, grâce à la haute O(n²)
complexité, très lent pour les grandes entrées. Je veux trouver une solution plus rapide et optimisée. O(n logn)
solution en utilisant un algorithme récursif de division et de conquête basé sur cet article Cette approche fonctionne bien pour la plupart des entrées, mais comme elle n'itère pas à travers tous les points, elle échoue sur des entrées comme celle-ci (l'ordre des paires et l'ordre des points à l'intérieur des paires n'ont pas d'importance) :
Input:
{A[0,0], B[1,0], C[1,1] D[0,1]}
Current (wrong) output:
{A[0,0], D[0,1]}, {B[1,0], C[1,1]}
Desired output:
{A[0,0], B[0,1]}, {A[0,0], D[0,1]}, {C[1,1], B[1,0]}, {C[1,1], D[1,0]}
et aussi parce que c'est récursif, la pile déborde facilement pour les entrées plus importantes. Quelle est la meilleure façon de résoudre ce problème ?
Merci.