fix style and make pseudo code

This commit is contained in:
Chris Cromer 2018-12-14 20:04:30 -03:00
parent d9ebc20886
commit aaf16efdaa
Signed by: cromer
GPG Key ID: 39CC813FF3C8708A
2 changed files with 89 additions and 3 deletions

View File

@ -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

View File

@ -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]; points_y2[++left] = points_y[i];
} }
else { 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); d = sqrt(min_d);
free(closest_pair2); free(closest_pair2);
left = -1; right = ny; left = -1;
right = ny;
for (i = 0; i < ny; i++) { for (i = 0; i < ny; i++) {
x = points_y[i].x - mid; x = points_y[i].x - mid;
if (x <= -d || x >= d) { 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; 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) { if ((x = distance(points_y2[left], points_y2[i])) < min_d) {
min_d = x; min_d = x;
closest_pair[0] = points_y2[left]; closest_pair[0] = points_y2[left];
closest_pair[1] = points_y2[i]; closest_pair[1] = points_y2[i];
} }
}
left--; left--;
} }