Se non hai bisogno di sapere la esatta risposta, dovresti leggere questo articolo:
link (archive.org link per impedire il link rot )
In primo luogo, è chiaro dal documento che non c'è modo di farlo per ottenere una risposta esatta più veloce dell'approccio della forza bruta:
Our aim is beating the obvious algorithm that computes the exact value of the
aforementioned average (by considering all pairs of points). But, unlike in the
graph theoretic setting (cf. [4]), we cannot hope for approximation algorithms
that run in time that is sub-linear in the number of points (because a single
“exceptional” point may dominate the value of the average of all pairwise distances).
Thus, we seek approximation algorithms that run in time that is almost
linear in the number of points. We consider two algorithmic approaches.
Quindi hanno una risposta facile: invece di calcolare la distanza euclidea per tutte le coppie di punti, puoi ottenere un'approssimazione sqrt(d)
calcolando la media delle distanze delle coordinate (sfortunatamente, Programmers.SE non ha MathJax quindi lo screenshot dovrà fare):
tl;drlinguaggiomatematico:fondamentalmentelaformulastasolodicendodiaggiungeretuttelecoppiedidistanzetralecoordinate.Adesempio,sqrt((x2-x1)^2+(y2-y1)^2)
diventasolox2-x1+y2-y1
elatuarispostasaràdisattivatasolodaunfattoresqrt(d)
,cheinquestocasoèsqrt(2)
.
Quindi,ildocumentocontinuaadiscuterediunalgoritmodicampionamentocasuale,cheèpiùaccurato.
Consiglio di leggere il documento per capire perché funziona, lo spiegano meglio di me.