Finish informe #4

Merged
cromer merged 14 commits from informe into master 2018-12-14 20:53:15 -03:00
2 changed files with 79 additions and 79 deletions
Showing only changes of commit e114151b87 - Show all commits

View File

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

View File

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