Browse Source

fix style and make pseudo code

Chris Cromer 5 months ago
parent
commit
aaf16efdaa
Signed by: Chris Cromer <chris@cromer.cl> GPG Key ID: 39CC813FF3C8708A
2 changed files with 89 additions and 3 deletions
  1. 84
    0
      doc/pseudo/divide_and_conquer.txt
  2. 5
    3
      src/divide_and_conquer.c

+ 84
- 0
doc/pseudo/divide_and_conquer.txt View File

@@ -0,0 +1,84 @@
1
+entrada: array: arreglo de n puntos; n: tamaño del arreglo
2
+salida: los dos puntos mas cercanos con su distancia
3
+
4
+funcion divide_and_conquer_run(puntos_x, nx, puntos_y, ny)
5
+	si nx <= 4 then
6
+		par_mas_cerca2 = brute_force(puntos_x, nx, d)
7
+		par_mas_cerca[0] = par_mas_cerca2[0]
8
+		par_mas_cerca[1] = par_mas_cerca2[1]
9
+		return d
10
+	fin si
11
+
12
+	medio = puntos_x[nx / 2].x;
13
+
14
+	izquerda = -1
15
+	derecha = ny
16
+	para i = 0 mientras que i < ny hacer
17
+		si puntos_y[i].x < medio entonces
18
+			puntos_y2[++izquerda] = puntos_y[i]
19
+		sino
20
+			puntos_y2[--derecha] = puntos_y[i]
21
+		fin si
22
+	fin para
23
+
24
+	para i = ny - 1 mientras que derecha < i hacer
25
+		par_mas_cerca2[0] = puntos_y2[derecha]
26
+		puntos_y2[derecha] = puntos_y2[i]
27
+		puntos_y2[i] = par_mas_cerca2[0]
28
+	fin para
29
+
30
+	min_d = divide_and_conquer_run(puntos_x, nx / 2, puntos_y2, izquerda + 1)
31
+	d = divide_and_conquer_run(puntos_x + nx / 2, nx - nx / 2, puntos_y2 + izquerda + 1, ny - izquerda - 1)
32
+
33
+	si d < min_d entonces
34
+		min_d = d
35
+		par_mas_cerca[0] = par_mas_cerca2[0]
36
+		par_mas_cerca[1] = par_mas_cerca2[1]
37
+	fin si
38
+	d = sqrt(min_d)
39
+
40
+	izquerda = -1
41
+	derecha = ny
42
+	para i = 0 mientras que i < ny hacer
43
+		x = puntos_y[i].x - medio
44
+		si x <= -d o x >= d entonces
45
+			continuar
46
+		fin si
47
+		si x < 0 entonces
48
+			puntos_y2[++izquerda]  = puntos_y[i]
49
+		sino
50
+			puntos_y2[--derecha] = puntos_y[i]
51
+		fin si
52
+	fin para
53
+
54
+	mientras que izquerda >= 0 hacer
55
+		x0 = puntos_y2[izquerda].y + d
56
+
57
+		mientras que derecha < ny y puntos_y2[derecha].y > x0 hacer
58
+			derecha = dercha + 1
59
+		fin mientras
60
+		si derecha >= ny entonces
61
+			romper
62
+		fin si
63
+
64
+		x1 = puntos_y2[izquerda].y - d
65
+		para i = derecha mientras que i < ny y puntos_y2[i].y > x1 hacer
66
+			si distance(puntos_y2[izquerda], puntos_y2[i])) < min_d entonces
67
+				min_d = x
68
+				par_mas_cerca[0] = puntos_y2[izquerda]
69
+				par_mas_cerca[1] = puntos_y2[i]
70
+			fin si
71
+		fin para
72
+		izquerda = izquerda - 1
73
+	fin mientras
74
+	return min_d
75
+fin funcion
76
+
77
+funcion divide_and_conquer(puntos, n) {
78
+	puntos_x = puntos
79
+	puntos_y = puntos
80
+	sort(puntos_x, n)
81
+	sort(puntos_y, n)
82
+	distancia_minimo y par_mas_cerca = divide_and_conquer_run(puntos_x, n, puntos_y, n)
83
+	return par_mas_cerca y distancia_minimo
84
+fin funcion

+ 5
- 3
src/divide_and_conquer.c View File

@@ -98,7 +98,7 @@ double divide_and_conquer_run(point_t *points_x, unsigned int nx, point_t *point
98 98
 			points_y2[++left] = points_y[i];
99 99
 		}
100 100
 		else {
101
-			points_y2[--right]= points_y[i];
101
+			points_y2[--right] = points_y[i];
102 102
 		}
103 103
 	}
104 104
 
@@ -119,7 +119,8 @@ double divide_and_conquer_run(point_t *points_x, unsigned int nx, point_t *point
119 119
 	d = sqrt(min_d);
120 120
 	free(closest_pair2);
121 121
 
122
-	left = -1; right = ny;
122
+	left = -1;
123
+	right = ny;
123 124
 	for (i = 0; i < ny; i++) {
124 125
 		x = points_y[i].x - mid;
125 126
 		if (x <= -d || x >= d) {
@@ -144,12 +145,13 @@ double divide_and_conquer_run(point_t *points_x, unsigned int nx, point_t *point
144 145
 		}
145 146
 
146 147
 		x1 = points_y2[left].y - d;
147
-		for (i = right; i < ny && points_y2[i].y > x1; i++)
148
+		for (i = right; i < ny && points_y2[i].y > x1; i++) {
148 149
 			if ((x = distance(points_y2[left], points_y2[i])) < min_d) {
149 150
 				min_d = x;
150 151
 				closest_pair[0] = points_y2[left];
151 152
 				closest_pair[1] = points_y2[i];
152 153
 			}
154
+		}
153 155
 		left--;
154 156
 	}
155 157
 

Loading…
Cancel
Save