Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Divide y vencers
(Divide-and-Conquer)
Caso 1
aaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa
aaaaabbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
Cuntas as
hay antes de
las bs?
Caso 2
1
2
3
5
8
9
10
12
15
23
24
27
28
29
31
32
33
35
38
39
40
42
45
53
54
57
58
59
61
62
63
65
68
69
70
72
75
83
84
87
88
89
91
92
93
95
98
99
100
102
105
113
114
117
118
119
121
122
123
125
128
129
130
132
135
143
144
147
148
149
151
152
153
155
158
159
160
162
165
173
174
177
178
179
181
182
183
185
188
189
190
192
195
203
204
207
208
209
211
212
213
215
218
219
220
222
225
233
234
237
238
239
241
242
243
245
248
249
250
252
255
263
264
267
268
269
271
272
273
275
278
279
280
282
285
293
294
297
298
299
301
302
303
305
308
309
310
312
315
323
324
327
328
329
331
332
333
335
338
339
340
342
345
353
354
357
358
359
Existe el
dato 227?
Caso 3
Divide y vencers
Las mximas latinas divide et impera
(pronunciado: dvide et mpera, divide y domina),
divide et vinces, divide ut imperes y divide ut
regnes, fueron utilizados por el gobernante
romano Julio Csar y el emperador corso Napolen.
Divide y vencers
Tcnica para enfrentar la solucin de problemas.
Consiste en dividir un problema en 2 o ms
instancias del problema ms pequeas, resolver
(conquistar) esas instancias, y obtener la solucin
general del problema, combinando las soluciones
de los problemas ms pequeos.
Utiliza un enfoque de solucin de tipo top-down.
Corresponde a una solucin natural de tipo
recursivo.
Bsqueda
Ordenamiento
Multiplicacin de matrices
Aritmtica de enteros
grandes
Mejor caso: 1
Peor caso: n
Caso promedio: depende de probabilidades
3n/4 + 1/4
Por lo tanto:
O(n)
log2 n veces
Bsqueda binaria
Enfoque con la tcnica de divide y vencers
SOLUCIN RECURSIVA
function busca (inicio, fin: index) : index
if (inicio > fin) then return 0;
else
mitad = (inicio + fin) div 2;
if (x == arreglo[mitad]) then return mitad;
else if (x < arreglo[mitad]) then
return(busca(inicio, mitad-1));
else return(busca(mitad+1,fin));
Bsqueda binaria
Es diferente el comportamiento del algoritmo
recursivo vs. el iterativo?
NO en el contexto general del tiempo de
ejecucin
La complejidad de tiempo es diferente, pero por
un valor constante
Por lo tanto, el orden es el mismo: O(log n)
SI en el contexto de la complejidad de espacio
del algoritmo, por el uso del stack en la
recursividad.
Ordenamiento
Merge Sort
Quick Sort
Merge Sort
10
10 27
22
25 13
12 20
15
25 13
12
20
12 20
10 12 20 27
15
25
15 22
13
15
13 25
13
10 12 13 15 20 22 25
22
22
15 22
15
27
22
25
Resolviendo la recurrencia
T(n)= 2*T(n/2)
T(n)= 2*(2*T(n/4)+ n/2-1)
T(n)= 4*T(n/4)
T(n)= 4*T(n/4)
T(n)= 4*(2*T(n/8)+(n/4-1))
T(n)= 8*T(n/8)
T(n)= 8*T(n/8)
T(n)= 2i*T(n/2i)
hasta que 2i = n y por lo tanto, i = log2n
T(n)= n*T(n/n)
T(n)= n*T(1)
T(n)= 0
T(n)= log2n*n(n-1)
O(n log n)
+
+
+
+
+
+
+
n-1
n-1
n-2 + n-1
2*n-3
2*n-3
n-4 + 2*n-3
3*n-7
+ i*n-(2i-1)
+ log2n*n(n-1)
+ log2n*n(n-1)
+ log2n*n(n-1)
Quick Sort
Divide el arreglo en 2 particiones, una que
contiene a los elementos menores a un
elemento pivote, y otra que contiene a los
elementos mayores al pivote.
Se ordenan ambas particiones, y
automticamente se tiene todo el arreglo
ordenado.
La eleccin del elemento pivote es libre (por
facilidad, se toma el primer elemento del
arreglo).
10 13 12
10
10
22 27 20
13 12
15
20
22
13
15
20
22
12
25
27
25
25
27
Algoritmo: Particin
Mdulo Particin (inicio, fin, pivote)
elempivote = arreglo[inicio]; j = inicio;
for (i = inicio+1; i<=fin; i++)
if (arreglo[i] < elempivote) then
j = j+1;
Intercambia arreglo[i] con arreglo[j]
pivote = j;
Intercambia arreglo[inicio] con arreglo[pivote]
EJEMPLO: 15 22 13 27 12 10 20 25
Resolviendo la recurrencia
T(n)= T(n-1) + n-1
T(n)= T(n-2)+ n-2 + n-1
T(n)= T(n-3)+ n-3 + n-2 + n-1
Algoritmo de Strassen
para Multiplicar Matrices
El anlisis matemtico de Strassen,
descubri que para:
c11 c12
c21 c22
a11 a12
a21 a22
b11 b12
b21 b22
Tales que:
c11 = m1 + m4 - m5 + m7
c12 = m3 + m5
c21 = m2 + m4
c22 = m1 + m3 - m2 + m6
Algoritmo de Strassen
Dividir cada una de las matrices en 4
submatrices, y resolver por el mtodo de
Strassen el problema.
C11 C12
C21 C22
A11 A12 X
A21 A22
B11 B12
B21 B22
Cada submatriz
es de n/2 X n/2
2.81
O(n )
e1 * e2
Algoritmo de la multiplicacin
Function Multiplica (n1, n2: entero_grande):
entero_grande;
n = cantidad de dgitos mayor entre n1 y n2.
if (n1 = 0 ) or (n2 = 0) return 0;
else if (n <= umbral ) return n1*n2 tradicional;
else
Lmite en que resulta mejor
m = n div 2;
realizar la operacin en forma
x1 = n1 div 10m; y1 = n1 mod 10m;
tradicional
x2 = n2 div 10m; y2 = n2 mod 10m;
r = Multiplica(x1+y1, x2+y2);
p = Multiplica(x1, x2); q = Multiplica(y1, y2);
return (p X 102m + (r-p-q) X 10m + q);
O(n1.58)
Funcin DV(x)
if x es suficientemente pequeo o sencillo
return (solucin tradicional al problema)
else
Descomponer x en casos ms pequeos x1, x2, xm
for i = 1 to m do yi = DV(xi)
Recombinar las yi para obtener la solucin y de x
return y
Comportamiento general de
algoritmos con DyV
O(nk) si m < bk
O(nk log n) si m = bk
O(nlogb m) si m > bk
donde m es la cantidad de subcasos ms
pequeos que se requieren para la solucin
(llamadas recursivas).
b es el factor con que se divide el problema en
casos ms pequeos.
k es un valor cualquiera para el anlisis.
Divide y vencers
(Divide-and-Conquer)
Caso 1
aaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa
aaaaabbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
Cuntas as
hay antes de
las bs?
Caso 2
1
2
3
5
8
9
10
12
15
23
24
27
28
29
31
32
33
35
38
39
40
42
45
53
54
57
58
59
61
62
63
65
68
69
70
72
75
83
84
87
88
89
91
92
93
95
98
99
100
102
105
113
114
117
118
119
121
122
123
125
128
129
130
132
135
143
144
147
148
149
151
152
153
155
158
159
160
162
165
173
174
177
178
179
181
182
183
185
188
189
190
192
195
203
204
207
208
209
211
212
213
215
218
219
220
222
225
233
234
237
238
239
241
242
243
245
248
249
250
252
255
263
264
267
268
269
271
272
273
275
278
279
280
282
285
293
294
297
298
299
301
302
303
305
308
309
310
312
315
323
324
327
328
329
331
332
333
335
338
339
340
342
345
353
354
357
358
359
Existe el
dato 227?
Caso 3
Divide y vencers
Las mximas latinas divide et impera
(pronunciado: dvide et mpera, divide y domina),
divide et vinces, divide ut imperes y divide ut
regnes, fueron utilizados por el gobernante
romano Julio Csar y el emperador corso Napolen.
Divide y vencers
Tcnica para enfrentar la solucin de problemas.
Consiste en dividir un problema en 2 o ms
instancias del problema ms pequeas, resolver
(conquistar) esas instancias, y obtener la solucin
general del problema, combinando las soluciones
de los problemas ms pequeos.
Utiliza un enfoque de solucin de tipo top-down.
Corresponde a una solucin natural de tipo
recursivo.
Bsqueda
Ordenamiento
Multiplicacin de matrices
Aritmtica de enteros
grandes
Mejor caso: 1
Peor caso: n
Caso promedio: depende de probabilidades
3n/4 + 1/4
Por lo tanto:
O(n)
log2 n veces
Bsqueda binaria
Enfoque con la tcnica de divide y vencers
SOLUCIN RECURSIVA
function busca (inicio, fin: index) : index
if (inicio > fin) then return 0;
else
mitad = (inicio + fin) div 2;
if (x == arreglo[mitad]) then return mitad;
else if (x < arreglo[mitad]) then
return(busca(inicio, mitad-1));
else return(busca(mitad+1,fin));
Bsqueda binaria
Es diferente el comportamiento del algoritmo
recursivo vs. el iterativo?
NO en el contexto general del tiempo de
ejecucin
La complejidad de tiempo es diferente, pero por
un valor constante
Por lo tanto, el orden es el mismo: O(log n)
SI en el contexto de la complejidad de espacio
del algoritmo, por el uso del stack en la
recursividad.
Ordenamiento
Merge Sort
Quick Sort
Merge Sort
10
10 27
22
25 13
12 20
15
25 13
12
20
12 20
10 12 20 27
15
25
15 22
13
15
13 25
13
10 12 13 15 20 22 25
22
22
15 22
15
27
22
25
Resolviendo la recurrencia
T(n)= 2*T(n/2)
T(n)= 2*(2*T(n/4)+ n/2-1)
T(n)= 4*T(n/4)
T(n)= 4*T(n/4)
T(n)= 4*(2*T(n/8)+(n/4-1))
T(n)= 8*T(n/8)
T(n)= 8*T(n/8)
T(n)= 2i*T(n/2i)
hasta que 2i = n y por lo tanto, i = log2n
T(n)= n*T(n/n)
T(n)= n*T(1)
T(n)= 0
T(n)= log2n*n(n-1)
O(n log n)
+
+
+
+
+
+
+
n-1
n-1
n-2 + n-1
2*n-3
2*n-3
n-4 + 2*n-3
3*n-7
+ i*n-(2i-1)
+ log2n*n(n-1)
+ log2n*n(n-1)
+ log2n*n(n-1)
Quick Sort
Divide el arreglo en 2 particiones, una que
contiene a los elementos menores a un
elemento pivote, y otra que contiene a los
elementos mayores al pivote.
Se ordenan ambas particiones, y
automticamente se tiene todo el arreglo
ordenado.
La eleccin del elemento pivote es libre (por
facilidad, se toma el primer elemento del
arreglo).
10 13 12
10
10
22 27 20
13 12
15
20
22
13
15
20
22
12
25
27
25
25
27
Algoritmo: Particin
Mdulo Particin (inicio, fin, pivote)
elempivote = arreglo[inicio]; j = inicio;
for (i = inicio+1; i<=fin; i++)
if (arreglo[i] < elempivote) then
j = j+1;
Intercambia arreglo[i] con arreglo[j]
pivote = j;
Intercambia arreglo[inicio] con arreglo[pivote]
EJEMPLO: 15 22 13 27 12 10 20 25
Resolviendo la recurrencia
T(n)= T(n-1) + n-1
T(n)= T(n-2)+ n-2 + n-1
T(n)= T(n-3)+ n-3 + n-2 + n-1
Algoritmo de Strassen
para Multiplicar Matrices
El anlisis matemtico de Strassen,
descubri que para:
c11 c12
c21 c22
a11 a12
a21 a22
b11 b12
b21 b22
Tales que:
c11 = m1 + m4 - m5 + m7
c12 = m3 + m5
c21 = m2 + m4
c22 = m1 + m3 - m2 + m6
Algoritmo de Strassen
Dividir cada una de las matrices en 4
submatrices, y resolver por el mtodo de
Strassen el problema.
C11 C12
C21 C22
A11 A12 X
A21 A22
B11 B12
B21 B22
Cada submatriz
es de n/2 X n/2
2.81
O(n )
e1 * e2
Algoritmo de la multiplicacin
Function Multiplica (n1, n2: entero_grande):
entero_grande;
n = cantidad de dgitos mayor entre n1 y n2.
if (n1 = 0 ) or (n2 = 0) return 0;
else if (n <= umbral ) return n1*n2 tradicional;
else
Lmite en que resulta mejor
m = n div 2;
realizar la operacin en forma
x1 = n1 div 10m; y1 = n1 mod 10m;
tradicional
x2 = n2 div 10m; y2 = n2 mod 10m;
r = Multiplica(x1+y1, x2+y2);
p = Multiplica(x1, x2); q = Multiplica(y1, y2);
return (p X 102m + (r-p-q) X 10m + q);
O(n1.58)
Funcin DV(x)
if x es suficientemente pequeo o sencillo
return (solucin tradicional al problema)
else
Descomponer x en casos ms pequeos x1, x2, xm
for i = 1 to m do yi = DV(xi)
Recombinar las yi para obtener la solucin y de x
return y
Comportamiento general de
algoritmos con DyV
O(nk) si m < bk
O(nk log n) si m = bk
O(nlogb m) si m > bk
donde m es la cantidad de subcasos ms
pequeos que se requieren para la solucin
(llamadas recursivas).
b es el factor con que se divide el problema en
casos ms pequeos.
k es un valor cualquiera para el anlisis.
Divide y vencers
(Divide-and-Conquer)
Caso 1
aaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa
aaaaabbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
Cuntas as
hay antes de
las bs?
Caso 2
1
2
3
5
8
9
10
12
15
23
24
27
28
29
31
32
33
35
38
39
40
42
45
53
54
57
58
59
61
62
63
65
68
69
70
72
75
83
84
87
88
89
91
92
93
95
98
99
100
102
105
113
114
117
118
119
121
122
123
125
128
129
130
132
135
143
144
147
148
149
151
152
153
155
158
159
160
162
165
173
174
177
178
179
181
182
183
185
188
189
190
192
195
203
204
207
208
209
211
212
213
215
218
219
220
222
225
233
234
237
238
239
241
242
243
245
248
249
250
252
255
263
264
267
268
269
271
272
273
275
278
279
280
282
285
293
294
297
298
299
301
302
303
305
308
309
310
312
315
323
324
327
328
329
331
332
333
335
338
339
340
342
345
353
354
357
358
359
Existe el
dato 227?
Caso 3
Divide y vencers
Las mximas latinas divide et impera
(pronunciado: dvide et mpera, divide y domina),
divide et vinces, divide ut imperes y divide ut
regnes, fueron utilizados por el gobernante
romano Julio Csar y el emperador corso Napolen.
Divide y vencers
Tcnica para enfrentar la solucin de problemas.
Consiste en dividir un problema en 2 o ms
instancias del problema ms pequeas, resolver
(conquistar) esas instancias, y obtener la solucin
general del problema, combinando las soluciones
de los problemas ms pequeos.
Utiliza un enfoque de solucin de tipo top-down.
Corresponde a una solucin natural de tipo
recursivo.
Bsqueda
Ordenamiento
Multiplicacin de matrices
Aritmtica de enteros
grandes
Mejor caso: 1
Peor caso: n
Caso promedio: depende de probabilidades
3n/4 + 1/4
Por lo tanto:
O(n)
log2 n veces
Bsqueda binaria
Enfoque con la tcnica de divide y vencers
SOLUCIN RECURSIVA
function busca (inicio, fin: index) : index
if (inicio > fin) then return 0;
else
mitad = (inicio + fin) div 2;
if (x == arreglo[mitad]) then return mitad;
else if (x < arreglo[mitad]) then
return(busca(inicio, mitad-1));
else return(busca(mitad+1,fin));
Bsqueda binaria
Es diferente el comportamiento del algoritmo
recursivo vs. el iterativo?
NO en el contexto general del tiempo de
ejecucin
La complejidad de tiempo es diferente, pero por
un valor constante
Por lo tanto, el orden es el mismo: O(log n)
SI en el contexto de la complejidad de espacio
del algoritmo, por el uso del stack en la
recursividad.
Ordenamiento
Merge Sort
Quick Sort
Merge Sort
10
10 27
22
25 13
12 20
15
25 13
12
20
12 20
10 12 20 27
15
25
15 22
13
15
13 25
13
10 12 13 15 20 22 25
22
22
15 22
15
27
22
25
Resolviendo la recurrencia
T(n)= 2*T(n/2)
T(n)= 2*(2*T(n/4)+ n/2-1)
T(n)= 4*T(n/4)
T(n)= 4*T(n/4)
T(n)= 4*(2*T(n/8)+(n/4-1))
T(n)= 8*T(n/8)
T(n)= 8*T(n/8)
T(n)= 2i*T(n/2i)
hasta que 2i = n y por lo tanto, i = log2n
T(n)= n*T(n/n)
T(n)= n*T(1)
T(n)= 0
T(n)= log2n*n(n-1)
O(n log n)
+
+
+
+
+
+
+
n-1
n-1
n-2 + n-1
2*n-3
2*n-3
n-4 + 2*n-3
3*n-7
+ i*n-(2i-1)
+ log2n*n(n-1)
+ log2n*n(n-1)
+ log2n*n(n-1)
Quick Sort
Divide el arreglo en 2 particiones, una que
contiene a los elementos menores a un
elemento pivote, y otra que contiene a los
elementos mayores al pivote.
Se ordenan ambas particiones, y
automticamente se tiene todo el arreglo
ordenado.
La eleccin del elemento pivote es libre (por
facilidad, se toma el primer elemento del
arreglo).
10 13 12
10
10
22 27 20
13 12
15
20
22
13
15
20
22
12
25
27
25
25
27
Algoritmo: Particin
Mdulo Particin (inicio, fin, pivote)
elempivote = arreglo[inicio]; j = inicio;
for (i = inicio+1; i<=fin; i++)
if (arreglo[i] < elempivote) then
j = j+1;
Intercambia arreglo[i] con arreglo[j]
pivote = j;
Intercambia arreglo[inicio] con arreglo[pivote]
EJEMPLO: 15 22 13 27 12 10 20 25
Resolviendo la recurrencia
T(n)= T(n-1) + n-1
T(n)= T(n-2)+ n-2 + n-1
T(n)= T(n-3)+ n-3 + n-2 + n-1
Algoritmo de Strassen
para Multiplicar Matrices
El anlisis matemtico de Strassen,
descubri que para:
c11 c12
c21 c22
a11 a12
a21 a22
b11 b12
b21 b22
Tales que:
c11 = m1 + m4 - m5 + m7
c12 = m3 + m5
c21 = m2 + m4
c22 = m1 + m3 - m2 + m6
Algoritmo de Strassen
Dividir cada una de las matrices en 4
submatrices, y resolver por el mtodo de
Strassen el problema.
C11 C12
C21 C22
A11 A12 X
A21 A22
B11 B12
B21 B22
Cada submatriz
es de n/2 X n/2
2.81
O(n )
e1 * e2
Algoritmo de la multiplicacin
Function Multiplica (n1, n2: entero_grande):
entero_grande;
n = cantidad de dgitos mayor entre n1 y n2.
if (n1 = 0 ) or (n2 = 0) return 0;
else if (n <= umbral ) return n1*n2 tradicional;
else
Lmite en que resulta mejor
m = n div 2;
realizar la operacin en forma
x1 = n1 div 10m; y1 = n1 mod 10m;
tradicional
x2 = n2 div 10m; y2 = n2 mod 10m;
r = Multiplica(x1+y1, x2+y2);
p = Multiplica(x1, x2); q = Multiplica(y1, y2);
return (p X 102m + (r-p-q) X 10m + q);
O(n1.58)
Funcin DV(x)
if x es suficientemente pequeo o sencillo
return (solucin tradicional al problema)
else
Descomponer x en casos ms pequeos x1, x2, xm
for i = 1 to m do yi = DV(xi)
Recombinar las yi para obtener la solucin y de x
return y
Comportamiento general de
algoritmos con DyV
O(nk) si m < bk
O(nk log n) si m = bk
O(nlogb m) si m > bk
donde m es la cantidad de subcasos ms
pequeos que se requieren para la solucin
(llamadas recursivas).
b es el factor con que se divide el problema en
casos ms pequeos.
k es un valor cualquiera para el anlisis.
Divide y vencers
(Divide-and-Conquer)
Caso 1
aaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa
aaaaabbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
Cuntas as
hay antes de
las bs?
Caso 2
1
2
3
5
8
9
10
12
15
23
24
27
28
29
31
32
33
35
38
39
40
42
45
53
54
57
58
59
61
62
63
65
68
69
70
72
75
83
84
87
88
89
91
92
93
95
98
99
100
102
105
113
114
117
118
119
121
122
123
125
128
129
130
132
135
143
144
147
148
149
151
152
153
155
158
159
160
162
165
173
174
177
178
179
181
182
183
185
188
189
190
192
195
203
204
207
208
209
211
212
213
215
218
219
220
222
225
233
234
237
238
239
241
242
243
245
248
249
250
252
255
263
264
267
268
269
271
272
273
275
278
279
280
282
285
293
294
297
298
299
301
302
303
305
308
309
310
312
315
323
324
327
328
329
331
332
333
335
338
339
340
342
345
353
354
357
358
359
Existe el
dato 227?
Caso 3
Divide y vencers
Las mximas latinas divide et impera
(pronunciado: dvide et mpera, divide y domina),
divide et vinces, divide ut imperes y divide ut
regnes, fueron utilizados por el gobernante
romano Julio Csar y el emperador corso Napolen.
Divide y vencers
Tcnica para enfrentar la solucin de problemas.
Consiste en dividir un problema en 2 o ms
instancias del problema ms pequeas, resolver
(conquistar) esas instancias, y obtener la solucin
general del problema, combinando las soluciones
de los problemas ms pequeos.
Utiliza un enfoque de solucin de tipo top-down.
Corresponde a una solucin natural de tipo
recursivo.
Bsqueda
Ordenamiento
Multiplicacin de matrices
Aritmtica de enteros
grandes
Mejor caso: 1
Peor caso: n
Caso promedio: depende de probabilidades
3n/4 + 1/4
Por lo tanto:
O(n)
log2 n veces
Bsqueda binaria
Enfoque con la tcnica de divide y vencers
SOLUCIN RECURSIVA
function busca (inicio, fin: index) : index
if (inicio > fin) then return 0;
else
mitad = (inicio + fin) div 2;
if (x == arreglo[mitad]) then return mitad;
else if (x < arreglo[mitad]) then
return(busca(inicio, mitad-1));
else return(busca(mitad+1,fin));
Bsqueda binaria
Es diferente el comportamiento del algoritmo
recursivo vs. el iterativo?
NO en el contexto general del tiempo de
ejecucin
La complejidad de tiempo es diferente, pero por
un valor constante
Por lo tanto, el orden es el mismo: O(log n)
SI en el contexto de la complejidad de espacio
del algoritmo, por el uso del stack en la
recursividad.
Ordenamiento
Merge Sort
Quick Sort
Merge Sort
10
10 27
22
25 13
12 20
15
25 13
12
20
12 20
10 12 20 27
15
25
15 22
13
15
13 25
13
10 12 13 15 20 22 25
22
22
15 22
15
27
22
25
Resolviendo la recurrencia
T(n)= 2*T(n/2)
T(n)= 2*(2*T(n/4)+ n/2-1)
T(n)= 4*T(n/4)
T(n)= 4*T(n/4)
T(n)= 4*(2*T(n/8)+(n/4-1))
T(n)= 8*T(n/8)
T(n)= 8*T(n/8)
T(n)= 2i*T(n/2i)
hasta que 2i = n y por lo tanto, i = log2n
T(n)= n*T(n/n)
T(n)= n*T(1)
T(n)= 0
T(n)= log2n*n(n-1)
O(n log n)
+
+
+
+
+
+
+
n-1
n-1
n-2 + n-1
2*n-3
2*n-3
n-4 + 2*n-3
3*n-7
+ i*n-(2i-1)
+ log2n*n(n-1)
+ log2n*n(n-1)
+ log2n*n(n-1)
Quick Sort
Divide el arreglo en 2 particiones, una que
contiene a los elementos menores a un
elemento pivote, y otra que contiene a los
elementos mayores al pivote.
Se ordenan ambas particiones, y
automticamente se tiene todo el arreglo
ordenado.
La eleccin del elemento pivote es libre (por
facilidad, se toma el primer elemento del
arreglo).
10 13 12
10
10
22 27 20
13 12
15
20
22
13
15
20
22
12
25
27
25
25
27
Algoritmo: Particin
Mdulo Particin (inicio, fin, pivote)
elempivote = arreglo[inicio]; j = inicio;
for (i = inicio+1; i<=fin; i++)
if (arreglo[i] < elempivote) then
j = j+1;
Intercambia arreglo[i] con arreglo[j]
pivote = j;
Intercambia arreglo[inicio] con arreglo[pivote]
EJEMPLO: 15 22 13 27 12 10 20 25
Resolviendo la recurrencia
T(n)= T(n-1) + n-1
T(n)= T(n-2)+ n-2 + n-1
T(n)= T(n-3)+ n-3 + n-2 + n-1
Algoritmo de Strassen
para Multiplicar Matrices
El anlisis matemtico de Strassen,
descubri que para:
c11 c12
c21 c22
a11 a12
a21 a22
b11 b12
b21 b22
Tales que:
c11 = m1 + m4 - m5 + m7
c12 = m3 + m5
c21 = m2 + m4
c22 = m1 + m3 - m2 + m6
Algoritmo de Strassen
Dividir cada una de las matrices en 4
submatrices, y resolver por el mtodo de
Strassen el problema.
C11 C12
C21 C22
A11 A12 X
A21 A22
B11 B12
B21 B22
Cada submatriz
es de n/2 X n/2
2.81
O(n )
e1 * e2
Algoritmo de la multiplicacin
Function Multiplica (n1, n2: entero_grande):
entero_grande;
n = cantidad de dgitos mayor entre n1 y n2.
if (n1 = 0 ) or (n2 = 0) return 0;
else if (n <= umbral ) return n1*n2 tradicional;
else
Lmite en que resulta mejor
m = n div 2;
realizar la operacin en forma
x1 = n1 div 10m; y1 = n1 mod 10m;
tradicional
x2 = n2 div 10m; y2 = n2 mod 10m;
r = Multiplica(x1+y1, x2+y2);
p = Multiplica(x1, x2); q = Multiplica(y1, y2);
return (p X 102m + (r-p-q) X 10m + q);
O(n1.58)
Funcin DV(x)
if x es suficientemente pequeo o sencillo
return (solucin tradicional al problema)
else
Descomponer x en casos ms pequeos x1, x2, xm
for i = 1 to m do yi = DV(xi)
Recombinar las yi para obtener la solucin y de x
return y
Comportamiento general de
algoritmos con DyV
O(nk) si m < bk
O(nk log n) si m = bk
O(nlogb m) si m > bk
donde m es la cantidad de subcasos ms
pequeos que se requieren para la solucin
(llamadas recursivas).
b es el factor con que se divide el problema en
casos ms pequeos.
k es un valor cualquiera para el anlisis.
Divide y vencers
(Divide-and-Conquer)
Caso 1
aaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa
aaaaabbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
Cuntas as
hay antes de
las bs?
Caso 2
1
2
3
5
8
9
10
12
15
23
24
27
28
29
31
32
33
35
38
39
40
42
45
53
54
57
58
59
61
62
63
65
68
69
70
72
75
83
84
87
88
89
91
92
93
95
98
99
100
102
105
113
114
117
118
119
121
122
123
125
128
129
130
132
135
143
144
147
148
149
151
152
153
155
158
159
160
162
165
173
174
177
178
179
181
182
183
185
188
189
190
192
195
203
204
207
208
209
211
212
213
215
218
219
220
222
225
233
234
237
238
239
241
242
243
245
248
249
250
252
255
263
264
267
268
269
271
272
273
275
278
279
280
282
285
293
294
297
298
299
301
302
303
305
308
309
310
312
315
323
324
327
328
329
331
332
333
335
338
339
340
342
345
353
354
357
358
359
Existe el
dato 227?
Caso 3
Divide y vencers
Las mximas latinas divide et impera
(pronunciado: dvide et mpera, divide y domina),
divide et vinces, divide ut imperes y divide ut
regnes, fueron utilizados por el gobernante
romano Julio Csar y el emperador corso Napolen.
Divide y vencers
Tcnica para enfrentar la solucin de problemas.
Consiste en dividir un problema en 2 o ms
instancias del problema ms pequeas, resolver
(conquistar) esas instancias, y obtener la solucin
general del problema, combinando las soluciones
de los problemas ms pequeos.
Utiliza un enfoque de solucin de tipo top-down.
Corresponde a una solucin natural de tipo
recursivo.
Bsqueda
Ordenamiento
Multiplicacin de matrices
Aritmtica de enteros
grandes
Mejor caso: 1
Peor caso: n
Caso promedio: depende de probabilidades
3n/4 + 1/4
Por lo tanto:
O(n)
log2 n veces
Bsqueda binaria
Enfoque con la tcnica de divide y vencers
SOLUCIN RECURSIVA
function busca (inicio, fin: index) : index
if (inicio > fin) then return 0;
else
mitad = (inicio + fin) div 2;
if (x == arreglo[mitad]) then return mitad;
else if (x < arreglo[mitad]) then
return(busca(inicio, mitad-1));
else return(busca(mitad+1,fin));
Bsqueda binaria
Es diferente el comportamiento del algoritmo
recursivo vs. el iterativo?
NO en el contexto general del tiempo de
ejecucin
La complejidad de tiempo es diferente, pero por
un valor constante
Por lo tanto, el orden es el mismo: O(log n)
SI en el contexto de la complejidad de espacio
del algoritmo, por el uso del stack en la
recursividad.
Ordenamiento
Merge Sort
Quick Sort
Merge Sort
10
10 27
22
25 13
12 20
15
25 13
12
20
12 20
10 12 20 27
15
25
15 22
13
15
13 25
13
10 12 13 15 20 22 25
22
22
15 22
15
27
22
25
Resolviendo la recurrencia
T(n)= 2*T(n/2)
T(n)= 2*(2*T(n/4)+ n/2-1)
T(n)= 4*T(n/4)
T(n)= 4*T(n/4)
T(n)= 4*(2*T(n/8)+(n/4-1))
T(n)= 8*T(n/8)
T(n)= 8*T(n/8)
T(n)= 2i*T(n/2i)
hasta que 2i = n y por lo tanto, i = log2n
T(n)= n*T(n/n)
T(n)= n*T(1)
T(n)= 0
T(n)= log2n*n(n-1)
O(n log n)
+
+
+
+
+
+
+
n-1
n-1
n-2 + n-1
2*n-3
2*n-3
n-4 + 2*n-3
3*n-7
+ i*n-(2i-1)
+ log2n*n(n-1)
+ log2n*n(n-1)
+ log2n*n(n-1)
Quick Sort
Divide el arreglo en 2 particiones, una que
contiene a los elementos menores a un
elemento pivote, y otra que contiene a los
elementos mayores al pivote.
Se ordenan ambas particiones, y
automticamente se tiene todo el arreglo
ordenado.
La eleccin del elemento pivote es libre (por
facilidad, se toma el primer elemento del
arreglo).
10 13 12
10
10
22 27 20
13 12
15
20
22
13
15
20
22
12
25
27
25
25
27
Algoritmo: Particin
Mdulo Particin (inicio, fin, pivote)
elempivote = arreglo[inicio]; j = inicio;
for (i = inicio+1; i<=fin; i++)
if (arreglo[i] < elempivote) then
j = j+1;
Intercambia arreglo[i] con arreglo[j]
pivote = j;
Intercambia arreglo[inicio] con arreglo[pivote]
EJEMPLO: 15 22 13 27 12 10 20 25
Resolviendo la recurrencia
T(n)= T(n-1) + n-1
T(n)= T(n-2)+ n-2 + n-1
T(n)= T(n-3)+ n-3 + n-2 + n-1
Algoritmo de Strassen
para Multiplicar Matrices
El anlisis matemtico de Strassen,
descubri que para:
c11 c12
c21 c22
a11 a12
a21 a22
b11 b12
b21 b22
Tales que:
c11 = m1 + m4 - m5 + m7
c12 = m3 + m5
c21 = m2 + m4
c22 = m1 + m3 - m2 + m6
Algoritmo de Strassen
Dividir cada una de las matrices en 4
submatrices, y resolver por el mtodo de
Strassen el problema.
C11 C12
C21 C22
A11 A12 X
A21 A22
B11 B12
B21 B22
Cada submatriz
es de n/2 X n/2
2.81
O(n )
e1 * e2
Algoritmo de la multiplicacin
Function Multiplica (n1, n2: entero_grande):
entero_grande;
n = cantidad de dgitos mayor entre n1 y n2.
if (n1 = 0 ) or (n2 = 0) return 0;
else if (n <= umbral ) return n1*n2 tradicional;
else
Lmite en que resulta mejor
m = n div 2;
realizar la operacin en forma
x1 = n1 div 10m; y1 = n1 mod 10m;
tradicional
x2 = n2 div 10m; y2 = n2 mod 10m;
r = Multiplica(x1+y1, x2+y2);
p = Multiplica(x1, x2); q = Multiplica(y1, y2);
return (p X 102m + (r-p-q) X 10m + q);
O(n1.58)
Funcin DV(x)
if x es suficientemente pequeo o sencillo
return (solucin tradicional al problema)
else
Descomponer x en casos ms pequeos x1, x2, xm
for i = 1 to m do yi = DV(xi)
Recombinar las yi para obtener la solucin y de x
return y
Comportamiento general de
algoritmos con DyV
O(nk) si m < bk
O(nk log n) si m = bk
O(nlogb m) si m > bk
donde m es la cantidad de subcasos ms
pequeos que se requieren para la solucin
(llamadas recursivas).
b es el factor con que se divide el problema en
casos ms pequeos.
k es un valor cualquiera para el anlisis.
Divide y vencers
(Divide-and-Conquer)
Caso 1
aaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa
aaaaabbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
Cuntas as
hay antes de
las bs?
Caso 2
1
2
3
5
8
9
10
12
15
23
24
27
28
29
31
32
33
35
38
39
40
42
45
53
54
57
58
59
61
62
63
65
68
69
70
72
75
83
84
87
88
89
91
92
93
95
98
99
100
102
105
113
114
117
118
119
121
122
123
125
128
129
130
132
135
143
144
147
148
149
151
152
153
155
158
159
160
162
165
173
174
177
178
179
181
182
183
185
188
189
190
192
195
203
204
207
208
209
211
212
213
215
218
219
220
222
225
233
234
237
238
239
241
242
243
245
248
249
250
252
255
263
264
267
268
269
271
272
273
275
278
279
280
282
285
293
294
297
298
299
301
302
303
305
308
309
310
312
315
323
324
327
328
329
331
332
333
335
338
339
340
342
345
353
354
357
358
359
Existe el
dato 227?
Caso 3
Divide y vencers
Las mximas latinas divide et impera
(pronunciado: dvide et mpera, divide y domina),
divide et vinces, divide ut imperes y divide ut
regnes, fueron utilizados por el gobernante
romano Julio Csar y el emperador corso Napolen.
Divide y vencers
Tcnica para enfrentar la solucin de problemas.
Consiste en dividir un problema en 2 o ms
instancias del problema ms pequeas, resolver
(conquistar) esas instancias, y obtener la solucin
general del problema, combinando las soluciones
de los problemas ms pequeos.
Utiliza un enfoque de solucin de tipo top-down.
Corresponde a una solucin natural de tipo
recursivo.
Bsqueda
Ordenamiento
Multiplicacin de matrices
Aritmtica de enteros
grandes
Mejor caso: 1
Peor caso: n
Caso promedio: depende de probabilidades
3n/4 + 1/4
Por lo tanto:
O(n)
log2 n veces
Bsqueda binaria
Enfoque con la tcnica de divide y vencers
SOLUCIN RECURSIVA
function busca (inicio, fin: index) : index
if (inicio > fin) then return 0;
else
mitad = (inicio + fin) div 2;
if (x == arreglo[mitad]) then return mitad;
else if (x < arreglo[mitad]) then
return(busca(inicio, mitad-1));
else return(busca(mitad+1,fin));
Bsqueda binaria
Es diferente el comportamiento del algoritmo
recursivo vs. el iterativo?
NO en el contexto general del tiempo de
ejecucin
La complejidad de tiempo es diferente, pero por
un valor constante
Por lo tanto, el orden es el mismo: O(log n)
SI en el contexto de la complejidad de espacio
del algoritmo, por el uso del stack en la
recursividad.
Ordenamiento
Merge Sort
Quick Sort
Merge Sort
10
10 27
22
25 13
12 20
15
25 13
12
20
12 20
10 12 20 27
15
25
15 22
13
15
13 25
13
10 12 13 15 20 22 25
22
22
15 22
15
27
22
25
Resolviendo la recurrencia
T(n)= 2*T(n/2)
T(n)= 2*(2*T(n/4)+ n/2-1)
T(n)= 4*T(n/4)
T(n)= 4*T(n/4)
T(n)= 4*(2*T(n/8)+(n/4-1))
T(n)= 8*T(n/8)
T(n)= 8*T(n/8)
T(n)= 2i*T(n/2i)
hasta que 2i = n y por lo tanto, i = log2n
T(n)= n*T(n/n)
T(n)= n*T(1)
T(n)= 0
T(n)= log2n*n(n-1)
O(n log n)
+
+
+
+
+
+
+
n-1
n-1
n-2 + n-1
2*n-3
2*n-3
n-4 + 2*n-3
3*n-7
+ i*n-(2i-1)
+ log2n*n(n-1)
+ log2n*n(n-1)
+ log2n*n(n-1)
Quick Sort
Divide el arreglo en 2 particiones, una que
contiene a los elementos menores a un
elemento pivote, y otra que contiene a los
elementos mayores al pivote.
Se ordenan ambas particiones, y
automticamente se tiene todo el arreglo
ordenado.
La eleccin del elemento pivote es libre (por
facilidad, se toma el primer elemento del
arreglo).
10 13 12
10
10
22 27 20
13 12
15
20
22
13
15
20
22
12
25
27
25
25
27
Algoritmo: Particin
Mdulo Particin (inicio, fin, pivote)
elempivote = arreglo[inicio]; j = inicio;
for (i = inicio+1; i<=fin; i++)
if (arreglo[i] < elempivote) then
j = j+1;
Intercambia arreglo[i] con arreglo[j]
pivote = j;
Intercambia arreglo[inicio] con arreglo[pivote]
EJEMPLO: 15 22 13 27 12 10 20 25
Resolviendo la recurrencia
T(n)= T(n-1) + n-1
T(n)= T(n-2)+ n-2 + n-1
T(n)= T(n-3)+ n-3 + n-2 + n-1
Algoritmo de Strassen
para Multiplicar Matrices
El anlisis matemtico de Strassen,
descubri que para:
c11 c12
c21 c22
a11 a12
a21 a22
b11 b12
b21 b22
Tales que:
c11 = m1 + m4 - m5 + m7
c12 = m3 + m5
c21 = m2 + m4
c22 = m1 + m3 - m2 + m6
Algoritmo de Strassen
Dividir cada una de las matrices en 4
submatrices, y resolver por el mtodo de
Strassen el problema.
C11 C12
C21 C22
A11 A12 X
A21 A22
B11 B12
B21 B22
Cada submatriz
es de n/2 X n/2
2.81
O(n )
e1 * e2
Algoritmo de la multiplicacin
Function Multiplica (n1, n2: entero_grande):
entero_grande;
n = cantidad de dgitos mayor entre n1 y n2.
if (n1 = 0 ) or (n2 = 0) return 0;
else if (n <= umbral ) return n1*n2 tradicional;
else
Lmite en que resulta mejor
m = n div 2;
realizar la operacin en forma
x1 = n1 div 10m; y1 = n1 mod 10m;
tradicional
x2 = n2 div 10m; y2 = n2 mod 10m;
r = Multiplica(x1+y1, x2+y2);
p = Multiplica(x1, x2); q = Multiplica(y1, y2);
return (p X 102m + (r-p-q) X 10m + q);
O(n1.58)
Funcin DV(x)
if x es suficientemente pequeo o sencillo
return (solucin tradicional al problema)
else
Descomponer x en casos ms pequeos x1, x2, xm
for i = 1 to m do yi = DV(xi)
Recombinar las yi para obtener la solucin y de x
return y
Comportamiento general de
algoritmos con DyV
O(nk) si m < bk
O(nk log n) si m = bk
O(nlogb m) si m > bk
donde m es la cantidad de subcasos ms
pequeos que se requieren para la solucin
(llamadas recursivas).
b es el factor con que se divide el problema en
casos ms pequeos.
k es un valor cualquiera para el anlisis.
Divide y vencers
(Divide-and-Conquer)
Caso 1
aaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa
aaaaabbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbb
Cuntas as
hay antes de
las bs?
Caso 2
1
2
3
5
8
9
10
12
15
23
24
27
28
29
31
32
33
35
38
39
40
42
45
53
54
57
58
59
61
62
63
65
68
69
70
72
75
83
84
87
88
89
91
92
93
95
98
99
100
102
105
113
114
117
118
119
121
122
123
125
128
129
130
132
135
143
144
147
148
149
151
152
153
155
158
159
160
162
165
173
174
177
178
179
181
182
183
185
188
189
190
192
195
203
204
207
208
209
211
212
213
215
218
219
220
222
225
233
234
237
238
239
241
242
243
245
248
249
250
252
255
263
264
267
268
269
271
272
273
275
278
279
280
282
285
293
294
297
298
299
301
302
303
305
308
309
310
312
315
323
324
327
328
329
331
332
333
335
338
339
340
342
345
353
354
357
358
359
Existe el
dato 227?
Caso 3
Divide y vencers
Las mximas latinas divide et impera
(pronunciado: dvide et mpera, divide y domina),
divide et vinces, divide ut imperes y divide ut
regnes, fueron utilizados por el gobernante
romano Julio Csar y el emperador corso Napolen.
Divide y vencers
Tcnica para enfrentar la solucin de problemas.
Consiste en dividir un problema en 2 o ms
instancias del problema ms pequeas, resolver
(conquistar) esas instancias, y obtener la solucin
general del problema, combinando las soluciones
de los problemas ms pequeos.
Utiliza un enfoque de solucin de tipo top-down.
Corresponde a una solucin natural de tipo
recursivo.
Bsqueda
Ordenamiento
Multiplicacin de matrices
Aritmtica de enteros
grandes
Mejor caso: 1
Peor caso: n
Caso promedio: depende de probabilidades
3n/4 + 1/4
Por lo tanto:
O(n)
log2 n veces
Bsqueda binaria
Enfoque con la tcnica de divide y vencers
SOLUCIN RECURSIVA
function busca (inicio, fin: index) : index
if (inicio > fin) then return 0;
else
mitad = (inicio + fin) div 2;
if (x == arreglo[mitad]) then return mitad;
else if (x < arreglo[mitad]) then
return(busca(inicio, mitad-1));
else return(busca(mitad+1,fin));
Bsqueda binaria
Es diferente el comportamiento del algoritmo
recursivo vs. el iterativo?
NO en el contexto general del tiempo de
ejecucin
La complejidad de tiempo es diferente, pero por
un valor constante
Por lo tanto, el orden es el mismo: O(log n)
SI en el contexto de la complejidad de espacio
del algoritmo, por el uso del stack en la
recursividad.
Ordenamiento
Merge Sort
Quick Sort
Merge Sort
10
10 27
22
25 13
12 20
15
25 13
12
20
12 20
10 12 20 27
15
25
15 22
13
15
13 25
13
10 12 13 15 20 22 25
22
22
15 22
15
27
22
25
Resolviendo la recurrencia
T(n)= 2*T(n/2)
T(n)= 2*(2*T(n/4)+ n/2-1)
T(n)= 4*T(n/4)
T(n)= 4*T(n/4)
T(n)= 4*(2*T(n/8)+(n/4-1))
T(n)= 8*T(n/8)
T(n)= 8*T(n/8)
T(n)= 2i*T(n/2i)
hasta que 2i = n y por lo tanto, i = log2n
T(n)= n*T(n/n)
T(n)= n*T(1)
T(n)= 0
T(n)= log2n*n(n-1)
O(n log n)
+
+
+
+
+
+
+
n-1
n-1
n-2 + n-1
2*n-3
2*n-3
n-4 + 2*n-3
3*n-7
+ i*n-(2i-1)
+ log2n*n(n-1)
+ log2n*n(n-1)
+ log2n*n(n-1)
Quick Sort
Divide el arreglo en 2 particiones, una que
contiene a los elementos menores a un
elemento pivote, y otra que contiene a los
elementos mayores al pivote.
Se ordenan ambas particiones, y
automticamente se tiene todo el arreglo
ordenado.
La eleccin del elemento pivote es libre (por
facilidad, se toma el primer elemento del
arreglo).
10 13 12
10
10
22 27 20
13 12
15
20
22
13
15
20
22
12
25
27
25
25
27
Algoritmo: Particin
Mdulo Particin (inicio, fin, pivote)
elempivote = arreglo[inicio]; j = inicio;
for (i = inicio+1; i<=fin; i++)
if (arreglo[i] < elempivote) then
j = j+1;
Intercambia arreglo[i] con arreglo[j]
pivote = j;
Intercambia arreglo[inicio] con arreglo[pivote]
EJEMPLO: 15 22 13 27 12 10 20 25
Resolviendo la recurrencia
T(n)= T(n-1) + n-1
T(n)= T(n-2)+ n-2 + n-1
T(n)= T(n-3)+ n-3 + n-2 + n-1
Algoritmo de Strassen
para Multiplicar Matrices
El anlisis matemtico de Strassen,
descubri que para:
c11 c12
c21 c22
a11 a12
a21 a22
b11 b12
b21 b22
Tales que:
c11 = m1 + m4 - m5 + m7
c12 = m3 + m5
c21 = m2 + m4
c22 = m1 + m3 - m2 + m6
Algoritmo de Strassen
Dividir cada una de las matrices en 4
submatrices, y resolver por el mtodo de
Strassen el problema.
C11 C12
C21 C22
A11 A12 X
A21 A22
B11 B12
B21 B22
Cada submatriz
es de n/2 X n/2
2.81
O(n )
e1 * e2
Algoritmo de la multiplicacin
Function Multiplica (n1, n2: entero_grande):
entero_grande;
n = cantidad de dgitos mayor entre n1 y n2.
if (n1 = 0 ) or (n2 = 0) return 0;
else if (n <= umbral ) return n1*n2 tradicional;
else
Lmite en que resulta mejor
m = n div 2;
realizar la operacin en forma
x1 = n1 div 10m; y1 = n1 mod 10m;
tradicional
x2 = n2 div 10m; y2 = n2 mod 10m;
r = Multiplica(x1+y1, x2+y2);
p = Multiplica(x1, x2); q = Multiplica(y1, y2);
return (p X 102m + (r-p-q) X 10m + q);
O(n1.58)
Funcin DV(x)
if x es suficientemente pequeo o sencillo
return (solucin tradicional al problema)
else
Descomponer x en casos ms pequeos x1, x2, xm
for i = 1 to m do yi = DV(xi)
Recombinar las yi para obtener la solucin y de x
return y
Comportamiento general de
algoritmos con DyV
O(nk) si m < bk
O(nk log n) si m = bk
O(nlogb m) si m > bk
donde m es la cantidad de subcasos ms
pequeos que se requieren para la solucin
(llamadas recursivas).
b es el factor con que se divide el problema en
casos ms pequeos.
k es un valor cualquiera para el anlisis.