commit
7beed00f63
5 changed files with 120 additions and 11 deletions
After Width: | Height: | Size: 30 KiB |
@ -0,0 +1,15 @@ |
||||
entrada: array: arreglo de n puntos; n: tamaño del arreglo |
||||
salida: los dos puntos mas cercanos con su distancia |
||||
|
||||
funcion brute_force(points, n) |
||||
para i = 0 mientras que i < n - 1 hacer |
||||
para j = i + 1 mientras que j < n hacer |
||||
si distance(points[i], points[j]) < distancia_minimo entonces |
||||
distancia_minimo = distancia |
||||
closest_pair[0] = points[i] |
||||
closest_pair[1] = points[j] |
||||
fin si |
||||
fin para |
||||
fin para |
||||
return par_mas_cerca y distancia_minimo |
||||
fin funcion |
@ -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 |
Loading…
Reference in new issue