Dato: Dato un insieme di N punti nel piano 2D (coordinate xey) e un set di N raggi corrispondenti a ciascun punto. Faremo riferimento al disco di un punto come il disco centrato nel punto con il suo raggio.Raggruppamento in 2 punti
Problema: Raggruppa i punti. Un gruppo di punti è tale che ogni punto cade all'interno del disco di almeno un altro punto nel cluster OPPURE almeno un altro punto nel cluster cade nel suo disco. I cluster di punti singoli non contano come cluster.
Ho bisogno di un algoritmo per calcolare questo in modo efficiente (preferibilmente senza ricorrere a complicate tecniche di hashing spaziale come kd-tree). Posso accontentarmi del tempo di esecuzione O (N^2) ma sicuramente non più di O (N^3). Credo che questo dovrebbe essere semplice, ma mi sto facendo prendere dalla natura non reciproca della mia condizione di clustering.
In sostanza, sto cercando di compilare il prototipo di funzione C:
int cluster_points(
size_t n,
point_t *pt, // length n list of points
double *radius, // length n list of radii for each point
int *cluster, // length n list of cluster indexes; -1 if not clustered
size_t *ncluster // number of clusters (number of distinct non -1 entries in cluster)
);
Questo non è lavoro. Ho bisogno di questo come parte di un algoritmo a matrice per il clustering di numeri complessi.
Nel passaggio 2ab, non è necessario andare avanti a tutti i punti aggiunti e guardare attraverso il resto dei punti non assegnati fino a quando non viene assegnato nulla di nuovo? –
@VictorLiu: io non la penso così. Con questo metodo, una volta stabilito il gruppo 1 (e spostato sul gruppo 2), il gruppo 1 contiene tutti i punti che soddisfano i criteri e si troveranno mai in questo gruppo. Quando definisci il gruppo 1, ogni volta che aggiungi un punto ad esso, spazzi tutti gli altri punti per vedere se ora potrebbero essere nel gruppo. Non c'è alcuna possibilità che, ad esempio, tu debba unirti al gruppo 1 e al gruppo 2, una volta stabilito il gruppo 1. – tom10