From aaf16efdaa8856a8bdce22e95370da3443cc8092 Mon Sep 17 00:00:00 2001 From: Chris Cromer Date: Fri, 14 Dec 2018 20:04:30 -0300 Subject: [PATCH] fix style and make pseudo code --- doc/pseudo/divide_and_conquer.txt | 84 +++++++++++++++++++++++++++++++ src/divide_and_conquer.c | 8 +-- 2 files changed, 89 insertions(+), 3 deletions(-) create mode 100644 doc/pseudo/divide_and_conquer.txt diff --git a/doc/pseudo/divide_and_conquer.txt b/doc/pseudo/divide_and_conquer.txt new file mode 100644 index 0000000..39f8a4d --- /dev/null +++ b/doc/pseudo/divide_and_conquer.txt @@ -0,0 +1,84 @@ +entrada: array: arreglo de n puntos; n: tamaƱo del arreglo +salida: los dos puntos mas cercanos con su distancia + +funcion divide_and_conquer_run(puntos_x, nx, puntos_y, ny) + si nx <= 4 then + par_mas_cerca2 = brute_force(puntos_x, nx, d) + par_mas_cerca[0] = par_mas_cerca2[0] + par_mas_cerca[1] = par_mas_cerca2[1] + return d + fin si + + medio = puntos_x[nx / 2].x; + + izquerda = -1 + derecha = ny + para i = 0 mientras que i < ny hacer + si puntos_y[i].x < medio entonces + puntos_y2[++izquerda] = puntos_y[i] + sino + puntos_y2[--derecha] = puntos_y[i] + fin si + fin para + + para i = ny - 1 mientras que derecha < i hacer + par_mas_cerca2[0] = puntos_y2[derecha] + puntos_y2[derecha] = puntos_y2[i] + puntos_y2[i] = par_mas_cerca2[0] + fin para + + min_d = divide_and_conquer_run(puntos_x, nx / 2, puntos_y2, izquerda + 1) + d = divide_and_conquer_run(puntos_x + nx / 2, nx - nx / 2, puntos_y2 + izquerda + 1, ny - izquerda - 1) + + si d < min_d entonces + min_d = d + par_mas_cerca[0] = par_mas_cerca2[0] + par_mas_cerca[1] = par_mas_cerca2[1] + fin si + d = sqrt(min_d) + + izquerda = -1 + derecha = ny + para i = 0 mientras que i < ny hacer + x = puntos_y[i].x - medio + si x <= -d o x >= d entonces + continuar + fin si + si x < 0 entonces + puntos_y2[++izquerda] = puntos_y[i] + sino + puntos_y2[--derecha] = puntos_y[i] + fin si + fin para + + mientras que izquerda >= 0 hacer + x0 = puntos_y2[izquerda].y + d + + mientras que derecha < ny y puntos_y2[derecha].y > x0 hacer + derecha = dercha + 1 + fin mientras + si derecha >= ny entonces + romper + fin si + + x1 = puntos_y2[izquerda].y - d + para i = derecha mientras que i < ny y puntos_y2[i].y > x1 hacer + si distance(puntos_y2[izquerda], puntos_y2[i])) < min_d entonces + min_d = x + par_mas_cerca[0] = puntos_y2[izquerda] + par_mas_cerca[1] = puntos_y2[i] + fin si + fin para + izquerda = izquerda - 1 + fin mientras + return min_d +fin funcion + +funcion divide_and_conquer(puntos, n) { + puntos_x = puntos + puntos_y = puntos + sort(puntos_x, n) + sort(puntos_y, n) + distancia_minimo y par_mas_cerca = divide_and_conquer_run(puntos_x, n, puntos_y, n) + return par_mas_cerca y distancia_minimo +fin funcion diff --git a/src/divide_and_conquer.c b/src/divide_and_conquer.c index 9cb11e4..e37a928 100644 --- a/src/divide_and_conquer.c +++ b/src/divide_and_conquer.c @@ -98,7 +98,7 @@ double divide_and_conquer_run(point_t *points_x, unsigned int nx, point_t *point points_y2[++left] = points_y[i]; } else { - points_y2[--right]= points_y[i]; + points_y2[--right] = points_y[i]; } } @@ -119,7 +119,8 @@ double divide_and_conquer_run(point_t *points_x, unsigned int nx, point_t *point d = sqrt(min_d); free(closest_pair2); - left = -1; right = ny; + left = -1; + right = ny; for (i = 0; i < ny; i++) { x = points_y[i].x - mid; if (x <= -d || x >= d) { @@ -144,12 +145,13 @@ double divide_and_conquer_run(point_t *points_x, unsigned int nx, point_t *point } x1 = points_y2[left].y - d; - for (i = right; i < ny && points_y2[i].y > x1; i++) + for (i = right; i < ny && points_y2[i].y > x1; i++) { if ((x = distance(points_y2[left], points_y2[i])) < min_d) { min_d = x; closest_pair[0] = points_y2[left]; closest_pair[1] = points_y2[i]; } + } left--; }