Finish informe #4
@ -1,15 +1,15 @@
|
|||||||
entrada: array: arreglo de n puntos; n: tamaño del arreglo
|
entrada: array: arreglo de n puntos; n: tamaño del arreglo
|
||||||
salida: los dos puntos mas cercanos con su distancia
|
salida: los dos puntos mas cercanos con su distancia
|
||||||
|
|
||||||
funcion brute_force(points, n) {
|
funcion brute_force(points, n)
|
||||||
para i = 0 mientras que i < n - 1 hacer
|
para i = 0 mientras que i < n - 1 hacer
|
||||||
para j = i + 1 mientras que j < n hacer
|
para j = i + 1 mientras que j < n hacer
|
||||||
si distance(points[i], points[j]) < distancia_minimo entonces
|
si distance(points[i], points[j]) < distancia_minimo entonces
|
||||||
distancia_minimo = distancia
|
distancia_minimo = distancia
|
||||||
closest_pair[0] = points[i]
|
closest_pair[0] = points[i]
|
||||||
closest_pair[1] = points[j]
|
closest_pair[1] = points[j]
|
||||||
}
|
fin si
|
||||||
}
|
fin para
|
||||||
}
|
fin para
|
||||||
return par_mas_cerca y distancia_minimo
|
return par_mas_cerca y distancia_minimo
|
||||||
fin funcion
|
fin funcion
|
||||||
|
@ -2,83 +2,83 @@ entrada: array: arreglo de n puntos; n: tamaño del arreglo
|
|||||||
salida: los dos puntos mas cercanos con su distancia
|
salida: los dos puntos mas cercanos con su distancia
|
||||||
|
|
||||||
funcion divide_and_conquer_run(puntos_x, nx, puntos_y, ny)
|
funcion divide_and_conquer_run(puntos_x, nx, puntos_y, ny)
|
||||||
si nx <= 4 then
|
si nx <= 4 then
|
||||||
par_mas_cerca2 = brute_force(puntos_x, nx, d)
|
par_mas_cerca2 = brute_force(puntos_x, nx, d)
|
||||||
par_mas_cerca[0] = par_mas_cerca2[0]
|
par_mas_cerca[0] = par_mas_cerca2[0]
|
||||||
par_mas_cerca[1] = par_mas_cerca2[1]
|
par_mas_cerca[1] = par_mas_cerca2[1]
|
||||||
return d
|
return d
|
||||||
fin si
|
fin si
|
||||||
|
|
||||||
medio = puntos_x[nx / 2].x;
|
medio = puntos_x[nx / 2].x;
|
||||||
|
|
||||||
izquerda = -1
|
izquerda = -1
|
||||||
derecha = ny
|
derecha = ny
|
||||||
para i = 0 mientras que i < ny hacer
|
para i = 0 mientras que i < ny hacer
|
||||||
si puntos_y[i].x < medio entonces
|
si puntos_y[i].x < medio entonces
|
||||||
puntos_y2[++izquerda] = puntos_y[i]
|
puntos_y2[++izquerda] = puntos_y[i]
|
||||||
sino
|
sino
|
||||||
puntos_y2[--derecha] = puntos_y[i]
|
puntos_y2[--derecha] = puntos_y[i]
|
||||||
fin si
|
fin si
|
||||||
fin para
|
fin para
|
||||||
|
|
||||||
para i = ny - 1 mientras que derecha < i hacer
|
para i = ny - 1 mientras que derecha < i hacer
|
||||||
par_mas_cerca2[0] = puntos_y2[derecha]
|
par_mas_cerca2[0] = puntos_y2[derecha]
|
||||||
puntos_y2[derecha] = puntos_y2[i]
|
puntos_y2[derecha] = puntos_y2[i]
|
||||||
puntos_y2[i] = par_mas_cerca2[0]
|
puntos_y2[i] = par_mas_cerca2[0]
|
||||||
fin para
|
fin para
|
||||||
|
|
||||||
min_d = divide_and_conquer_run(puntos_x, nx / 2, puntos_y2, izquerda + 1)
|
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)
|
d = divide_and_conquer_run(puntos_x + nx / 2, nx - nx / 2, puntos_y2 + izquerda + 1, ny - izquerda - 1)
|
||||||
|
|
||||||
si d < min_d entonces
|
si d < min_d entonces
|
||||||
min_d = d
|
min_d = d
|
||||||
par_mas_cerca[0] = par_mas_cerca2[0]
|
par_mas_cerca[0] = par_mas_cerca2[0]
|
||||||
par_mas_cerca[1] = par_mas_cerca2[1]
|
par_mas_cerca[1] = par_mas_cerca2[1]
|
||||||
fin si
|
fin si
|
||||||
d = sqrt(min_d)
|
d = sqrt(min_d)
|
||||||
|
|
||||||
izquerda = -1
|
izquerda = -1
|
||||||
derecha = ny
|
derecha = ny
|
||||||
para i = 0 mientras que i < ny hacer
|
para i = 0 mientras que i < ny hacer
|
||||||
x = puntos_y[i].x - medio
|
x = puntos_y[i].x - medio
|
||||||
si x <= -d o x >= d entonces
|
si x <= -d o x >= d entonces
|
||||||
continuar
|
continuar
|
||||||
fin si
|
fin si
|
||||||
si x < 0 entonces
|
si x < 0 entonces
|
||||||
puntos_y2[++izquerda] = puntos_y[i]
|
puntos_y2[++izquerda] = puntos_y[i]
|
||||||
sino
|
sino
|
||||||
puntos_y2[--derecha] = puntos_y[i]
|
puntos_y2[--derecha] = puntos_y[i]
|
||||||
fin si
|
fin si
|
||||||
fin para
|
fin para
|
||||||
|
|
||||||
mientras que izquerda >= 0 hacer
|
mientras que izquerda >= 0 hacer
|
||||||
x0 = puntos_y2[izquerda].y + d
|
x0 = puntos_y2[izquerda].y + d
|
||||||
|
|
||||||
mientras que derecha < ny y puntos_y2[derecha].y > x0 hacer
|
mientras que derecha < ny y puntos_y2[derecha].y > x0 hacer
|
||||||
derecha = dercha + 1
|
derecha = dercha + 1
|
||||||
fin mientras
|
fin mientras
|
||||||
si derecha >= ny entonces
|
si derecha >= ny entonces
|
||||||
romper
|
romper
|
||||||
fin si
|
fin si
|
||||||
|
|
||||||
x1 = puntos_y2[izquerda].y - d
|
x1 = puntos_y2[izquerda].y - d
|
||||||
para i = derecha mientras que i < ny y puntos_y2[i].y > x1 hacer
|
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
|
si distance(puntos_y2[izquerda], puntos_y2[i])) < min_d entonces
|
||||||
min_d = x
|
min_d = x
|
||||||
par_mas_cerca[0] = puntos_y2[izquerda]
|
par_mas_cerca[0] = puntos_y2[izquerda]
|
||||||
par_mas_cerca[1] = puntos_y2[i]
|
par_mas_cerca[1] = puntos_y2[i]
|
||||||
fin si
|
fin si
|
||||||
fin para
|
fin para
|
||||||
izquerda = izquerda - 1
|
izquerda = izquerda - 1
|
||||||
fin mientras
|
fin mientras
|
||||||
return min_d
|
return min_d
|
||||||
fin funcion
|
fin funcion
|
||||||
|
|
||||||
funcion divide_and_conquer(puntos, n) {
|
funcion divide_and_conquer(puntos, n)
|
||||||
puntos_x = puntos
|
puntos_x = puntos
|
||||||
puntos_y = puntos
|
puntos_y = puntos
|
||||||
sort(puntos_x, n)
|
sort(puntos_x, n)
|
||||||
sort(puntos_y, n)
|
sort(puntos_y, n)
|
||||||
distancia_minimo y par_mas_cerca = divide_and_conquer_run(puntos_x, n, 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
|
return par_mas_cerca y distancia_minimo
|
||||||
fin funcion
|
fin funcion
|
||||||
|
Loading…
Reference in New Issue
Block a user