Professional Documents
Culture Documents
v
v
v
v
v
v
v
v
v
v
Introduccin
La bsqueda dicotmica
La ordenacin por fusin
El algoritmo de ordenacin
de Hoare
Algoritmos de seleccin y
de bsqueda de la mediana
Multiplicacin de enteros grandes
Potenciacin de enteros
Introduccin a la criptografa
Multiplicacin de matrices
Calendario de un campeonato
2
8
13
15
18
22
29
36
47
52
Esquema genrico:
funcin
funcin divide_y_vencers(x:tx)
divide_y_vencers(x:tx) devuelve
devuelve ty
ty
variables
variables xx11,,
,x
,xkk:tx;
:tx; yy11,,
,y
,ykk:ty
:ty
principio
principio
si
si xx es
es suficientemente
suficientemente simple
simple
entonces
entonces devuelve
devuelve solucin_simple(x)
solucin_simple(x)
sino
sino
descomponer
descomponer xx en
en xx11,,
,x
,xkk;;
para
para i:=1
i:=1 hasta
hasta kk hacer
hacer
yyi:=divide_y_vencers(x
ii))
i:=divide_y_vencers(x
fpara;
fpara;
devuelve
devuelve combinar(y
combinar(y11,,
,y
,ykk))
fsi
fsi
fin
fin
(n / 2)+ t (n)
2
n + 1
+ dn
3c
2
3 2 3
3
= cn + c + d n + c
4
2
t A (n)
si n n 0
tC (n) =
3t C n / 2 + t (n) en otro caso
Recordar
una de las ecuaciones en recurrencias
especialmente til para el anlisis de
algoritmos de divide y vencers:
La solucin de la ecuacin
T(n) = aT(n/b) + (nklogpn)
con a1, b>1, p0 es
O (nlog b a ),
si a > bk
T (n) O (n k log p+ 1 n) , si a = bk
k
O (n k log p n) ,
si
a
<
b
La bsqueda dicotmica
v
Problema:
Dado T[1..n] vector ordenado crecientemente y
dado x, encontrar x en T, si es que est.
Formalmente: encontrar un natural i tal que
0in y T[i]x<T[i+1], con el convenio de que
T[0]=- y T[n+1]=+ (centinelas).
Solucin secuencial evidente:
funcin
funcin secuencial(T:vector[1..n]de
secuencial(T:vector[1..n]de dato;
dato;
x:dato)
x:dato) devuelve
devuelve 0..n
0..n
variables
variables i:0..n+1;
i:0..n+1; b:booleano
b:booleano
principio
principio
i:=1;
i:=1; b:=falso;
b:=falso;
mq
mq (i
(in)
n) and
and not
not bb hacer
hacer
si
si T[i]>x
T[i]>x
entonces
entonces b:=verdad
b:=verdad
sino
sino i:=i+1
i:=i+1
fsi
fsi
fmq;
fmq;
devuelve
devuelve i-1
i-1
fin
fin
Coste caso promedio y caso peor: (n)
J. Campos - C.P.S. Esquemas algortmicos - Divide y vencers Pg. 8
La bsqueda dicotmica
v
funcin
funcin dicotmica(T:vector[1..n]de
dicotmica(T:vector[1..n]de dato;
dato;
x:dato)
x:dato) devuelve
devuelve 0..n
0..n
principio
principio
si
si (n=0)
(n=0) or
or (x<T[1])
(x<T[1]) entonces
entonces devuelve
devuelve 00
sino
sino devuelve
devuelve dicotRec(T,1,n,x)
dicotRec(T,1,n,x)
fsi
fsi
fin
fin
funcin
funcin dicotRec(T:vector[1..n]de
dicotRec(T:vector[1..n]de dato;
dato;
i,d:1..n;
i,d:1..n;
x:dato)
x:dato) devuelve
devuelve 1..n
1..n
{bsqueda
{bsqueda dicotmica
dicotmica de
de xx en
en T[i..d];
T[i..d];
se
se supone
supone que
que T[i]x<T[d+1]
T[i]x<T[d+1] ee id}
id}
variable
variable k:1..n
k:1..n
principio
principio
si
si i=d
i=d entonces
entonces devuelve
devuelve ii
sino
sino
k:=(i+d+1)
k:=(i+d+1) div
div 2;
2;
si
si x<T[k]
x<T[k]
ent
ent devuelve
devuelve dicotRec(T,i,k-1,x)
dicotRec(T,i,k-1,x)
sino
devuelve
sino devuelve dicotRec(T,k,d,x)
dicotRec(T,k,d,x)
fsi
fsi
fsi
fsi
fin
fin
J. Campos - C.P.S. Esquemas algortmicos - Divide y vencers Pg. 9
La bsqueda dicotmica
v
Versin iterativa:
funcin
funcin dicotIter(T:vector[1..n]de
dicotIter(T:vector[1..n]de dato;
dato;
x:dato)
x:dato) devuelve
devuelve 0..n
0..n
variables
variables i,d,k:1..n
i,d,k:1..n
principio
principio
si
si (n=0)
(n=0) or
or (x<T[1])
(x<T[1])
entonces
entonces devuelve
devuelve 00
sino
sino
i:=1;
i:=1; d:=n;
d:=n;
mq
mq i<d
i<d hacer
hacer
{T[i]x<T[d+1]}
{T[i]x<T[d+1]}
k:=(i+d+1)
k:=(i+d+1) div
div 2;
2;
si
x<T[k]
si x<T[k]
entonces
entonces d:=k-1
d:=k-1
sino
sino i:=k
i:=k
fsi
fsi
fmq;
fmq;
devuelve
devuelve ii
fsi
fsi
fin
fin
Coste: (log n), en todos los casos.
La bsqueda dicotmica
v
Mejora aparente:
funcin
funcin dicotIter2(T:vector[1..n]de
dicotIter2(T:vector[1..n]de dato;
dato;
x:dato)
x:dato) devuelve
devuelve 0..n
0..n
variable
variable i,d,k:1..n
i,d,k:1..n
principio
principio
si
si (n=0)
(n=0) or
or (x<T[1])
(x<T[1])
entonces
entonces devuelve
devuelve 00
sino
sino
i:=1;
i:=1; d:=n;
d:=n;
mq
mq i<d
i<d hacer
hacer
{T[i]x<T[d+1]}
{T[i]x<T[d+1]}
k:=(i+d)
k:=(i+d) div
div 2;
2;
si
x<T[k]
si x<T[k]
entonces
entonces d:=k-1
d:=k-1
sino
sino
si
si xxT[k+1]
T[k+1]
entonces
entonces i:=k+1
i:=k+1
sino
sino i:=k;
i:=k; d:=k
d:=k
fsi
fsi
fsi
fsi
fmq;
fmq;
devuelve
devuelve ii
fsi
fsi
fin
fin
J. Campos - C.P.S. Esquemas algortmicos - Divide y vencers Pg. 11
La bsqueda dicotmica
v
3
2
algoritmo
algoritmo ordFusin(e/s
ordFusin(e/s T:vect[1..n]de
T:vect[1..n]de dato)
dato)
variables
variables U:vect[1..(n
U:vect[1..(n div
div 2)]de
2)]de dato;
dato;
V:vect[1..((n+1)
V:vect[1..((n+1) div
div 2)]de
2)]de dato
dato
principio
principio
si
si nn es
es pequeo
pequeo
entonces
entonces ordInsercin(T)
ordInsercin(T)
sino
sino
U:=T[1..(n
U:=T[1..(n div
div 2)];
2)];
V:=T[(n
V:=T[(n div
div 22 ++ 1)..n];
1)..n];
ordFusin(U);
ordFusin(U);
ordFusin(V);
ordFusin(V);
fusin(T,U,V)
fusin(T,U,V)
fsi
fsi
fin
fin
J. Campos - C.P.S. Esquemas algortmicos - Divide y vencers Pg. 13
Coste de ejecucin:
la descomposicin de T en U y V precisa un
tiempo lineal;
la fusin de U y V tambin necesita un tiempo
lineal;
por tanto, si t(n) es el tiempo de ejecucin del
algoritmo para ordenar n elementos,
) (
t (n) t n / 2 + t n / 2 + (n)
es decir, t(n)(nlog n)
v
Adems:
La fusin de T[1..k] y T[k+1..n] (ya ordenados) en
el mismo T[1..n] puede hacerse en tiempo lineal
utilizando slo una cantidad fija de variables
auxiliares (independiente de n).
Ejercicio (vase la solucin del ejercicio 18 de la
seccin 5.2.4 de [Knu73]).
El algoritmo de ordenacin de
Hoare
C.A.R. Hoare: Quicksort,
Computer Journal, 5(1), pp. 10-15, 1962.
algoritmo
algoritmo ordRpida(e/s
ordRpida(e/s T:vect[1..n]de
T:vect[1..n]de dato;
dato;
ent
ent iz,de:1..n)
iz,de:1..n)
{Ordenacin
{Ordenacin de
de las
las componentes
componentes iz..de
iz..de de
de T.}
T.}
variable
variable me:1..n
me:1..n
principio
principio
si
si de-iz
de-iz es
es pequeo
pequeo
entonces
entonces ordInsercin(T,iz,de)
ordInsercin(T,iz,de)
sino
sino
divide(T,iz,de,me);
divide(T,iz,de,me);
{izk<meT[k]T[me]
{izk<meT[k]T[me] me<kdeT[k]>T[me]}
me<kdeT[k]>T[me]}
ordRpida(T,iz,me-1);
ordRpida(T,iz,me-1);
ordRpida(T,me+1,de)
ordRpida(T,me+1,de)
fsi
fsi
fin
fin
El algoritmo de ordenacin de
Hoare
algoritmo
algoritmo divide(e/s
divide(e/s T:vect[1..n]de
T:vect[1..n]de dato;
dato;
ent
ent iz,de:1..n;
iz,de:1..n;
sal
sal me:1..n)
me:1..n)
{Permuta
{Permuta los
los elementos
elementos iz..de
iz..de de
de TT de
de forma
forma que:
que:
izmede,
izmede,
k
k t.q.
t.q. izk<me:
izk<me: T[k]p,
T[k]p,
T[me]=p,
T[me]=p,
k
k t.q.
t.q. me<kde:
me<kde: T[k]>p,
T[k]>p,
pp se
llama
pivote
se llama pivote yy es,
es, por
por ejemplo,
ejemplo, el
el valor
valor
inicial
inicial de
de T[iz].
T[iz]. }}
variables
variables p:dato;
p:dato; k:1..n
k:1..n
principio
principio
p:=T[iz];
p:=T[iz];
k:=iz;
k:=iz; me:=de+1;
me:=de+1;
repetir
repetir k:=k+1
k:=k+1 hasta
hasta que
que (T[k]>p)or(k
(T[k]>p)or(kde);
de);
repetir
repetir me:=me-1
me:=me-1 hasta
hasta que
que (T[me]
(T[me]p);
p);
mq
k<me
hacer
mq k<me hacer
intercambiar(T[k],T[me]);
intercambiar(T[k],T[me]);
repetir
repetir k:=k+1
k:=k+1 hasta
hasta que
que T[k]>p;
T[k]>p;
repetir
repetir me:=me-1
me:=me-1 hasta
hasta que
que T[me]
T[me]pp
fmq;
fmq;
intercambiar(T[iz],T[me])
intercambiar(T[iz],T[me])
fin
fin
El algoritmo de ordenacin de
Hoare
v
Algoritmos de seleccin y de
bsqueda de la mediana
v
{i [1..n ]|
T [i ] < m
}< n / 2 ,
{i [1..n ]|
T [i ] > m n / 2
Algoritmos de seleccin y de
bsqueda de la mediana
v
{i [1..n ]|
T [i ]< m
}< k ,
{i [1..n ]|
T [i ] m k
Algoritmos de seleccin y de
bsqueda de la mediana
funcin
funcin seleccionar(T:vector[1..n]de
seleccionar(T:vector[1..n]de dato;
dato;
k:1..n)
k:1..n) devuelve
devuelve dato
dato
principio
principio
devuelve
devuelve selRec(T,1,n,k)
selRec(T,1,n,k)
fin
fin
funcin
funcin selRec(T:vector[1..n]de
selRec(T:vector[1..n]de dato;
dato;
i,d,k:1..n)
i,d,k:1..n) devuelve
devuelve dato
dato
principio
principio
si
si d-i
d-i es
es pequeo
pequeo entonces
entonces
ordInsercin(T,i,d);
ordInsercin(T,i,d); devuelve
devuelve T[k]
T[k]
sino
sino
divide(T,i,d,m);
divide(T,i,d,m);
si
si m-i+1
m-i+1kk
entonces
entonces selRec(T,i,m,k)
selRec(T,i,m,k)
sino
sino selRec(T,m+1,d,k-(m-i+1))
selRec(T,m+1,d,k-(m-i+1))
fsi
fsi
fsi
fsi
fin
fin
algoritmo
algoritmo divide(e/s
divide(e/s T:vect[1..n]de
T:vect[1..n]de dato;
dato;
ent
ent i,d:1..n;
i,d:1..n; sal
sal m:1..n)
m:1..n)
{Permuta
{Permuta los
los elementos
elementos i..d
i..d de
de TT de
de forma
forma que:
que:
imd;
imd; k
k t.q.
t.q. ik<m:
ik<m: T[k]p;
T[k]p; T[m]=p;
T[m]=p;
k
k t.q.
t.q. m<kd:
m<kd: T[k]>p;
T[k]>p;
pp es,
por
ejemplo,
es, por ejemplo, el
el valor
valor inicial
inicial de
de T[i].
T[i]. }}
J. Campos - C.P.S. Esquemas algortmicos - Divide y vencers Pg. 20
Algoritmos de seleccin y de
bsqueda de la mediana
v
Multiplicacin de enteros
grandes
v
Multiplicacin de enteros
grandes
A. Karatsuba e Y. Ofman:
Multiplication of multidigit numbers on automata,
Dokl. Akad. Nauk SSSR, 145, pp. 293-294, 1962.
x
<
10
,
0
z
<
10
,y
s
v = 10 y + z
s = n 2
y
n/2
z
n/2
El producto es:
uv = 10 2 s wy + 10 s (wz + xy ) + xz
Multiplicacin de enteros
grandes
funcin
funcin mult(u,v:granEnt)
mult(u,v:granEnt) devuelve
devuelve granEnt
granEnt
variables
n,s:entero;
w,x,y,z:granEnt
variables n,s:entero; w,x,y,z:granEnt
principio
principio
n:=mx(tamao(u),tamao(v));
n:=mx(tamao(u),tamao(v));
si
si nn es
es pequeo
pequeo
entonces
entonces devuelve
devuelve multClsica(u,v)
multClsica(u,v)
sino
sino
s:=n
s:=n div
div 2;
2;
s
s
w:=u
w:=u div
div 10
10s;; x:=u
x:=u mod
mod 10
10s;;
s
s
y:=v
y:=v div
div 10
10s;; z:=v
z:=v mod
mod 10
10s;;
2s
devuelve
devuelve mult(w,y)*10
mult(w,y)*102s
s
+(mult(w,z)+mult(x.y))*10
+(mult(w,z)+mult(x.y))*10s
+mult(x,z)
+mult(x,z)
fsi
fsi
fin
fin
Multiplicacin de enteros
grandes
v
Coste temporal:
Las sumas, multiplicaciones por potencias de 10
y divisiones por potencias de 10: tiempo lineal.
Operacin mdulo una potencia de 10: tiempo
lineal (puede hacerse con una divisin, una
multiplicacin y una resta).
Por tanto, si t(n) es el tiempo del algoritmo:
t (n) = 3t
(n 2 )+ t (n 2 )+ (n)
Si n se supone potencia de 2,
( )
t (n) = 4t n 2 + (n)
Multiplicacin de enteros
grandes
Truco: calcular wy, wz+xy, y xz haciendo menos
de cuatro multiplicaciones.
Teniendo en cuenta que:
r = (w + x ) (y + z ) = wy + (wz + xy ) + xz
funcin
funcin mult2(u,v:granEnt)
mult2(u,v:granEnt) devuelve
devuelve granEnt
granEnt
variables
n,s:entero;
w,x,y,z,r,p,q:granEnt
variables n,s:entero; w,x,y,z,r,p,q:granEnt
principio
principio
n:=mx(tamao(u),tamao(v));
n:=mx(tamao(u),tamao(v));
si
si nn es
es pequeo
pequeo
entonces
entonces devuelve
devuelve multClsica(u,v)
multClsica(u,v)
sino
sino
s:=n
s:=n div
div 2;
2;
s
s
w:=u
w:=u div
div 10
10s;; x:=u
x:=u mod
mod 10
10s;;
s
s
y:=v
y:=v div
div 10
10s;; z:=v
z:=v mod
mod 10
10s;;
r:=mult2(w+x,y+z);
r:=mult2(w+x,y+z);
p:=mult2(w,y);
p:=mult2(w,y); q:=mult2(x,z);
q:=mult2(x,z);
2s
s
devuelve
devuelve p*10
p*102s+(r-p-q)*10
+(r-p-q)*10s+q
+q
fsi
fsi
fin
fin
Multiplicacin de enteros
grandes
v
) (
) (
t 2 (n) t 2 n 2 + t 2 n 2 + t 2 1 + n 2 + (n)
Y por tanto,
( ) ( )
t 2 (n) n log 3 O n 1 , 59
Multiplicacin de enteros
grandes
La diferencia entre los rdenes n2 y n1,59 es menos
espectacular que la existente entre n2 y nlog n.
Ejemplo realizado en un computador en base 220:
(computador con palabras de 60 dgitos, que
permite multiplicar directamente nmeros de 20
dgitos binarios)
u Multiplicacin de nmeros de unas 602
cifras (base decimal):
algoritmo clsico: 400 milisegundos
algoritmo mult2: 300 milisegundos
u Multiplicaciones de nmeros de unas 6000
cifras (base decimal):
algoritmo clsico: 40 segundos
algoritmo mult2: 15 segundos
Descomponiendo los operandos en ms de dos
partes se puede lograr la multiplicacin de dos
enteros en un tiempo del orden de n , para
cualquier >1.
Descomponiendo los operandos en n1/2 partes y
usando la transformada de Fourier, se pueden
multiplicar dos enteros de n cifras en un tiempo
O(n log n loglog n).
Potenciacin de enteros
v
Problema:
Dados los enteros positivos a, n y z, se
trata de calcular an mod z.
Solucin ingenua:
funcin
devuelve
entero
funcin pot0(a,n,z:entero)
pot0(a,n,z:entero)
devuelve
entero
n
{Devuelve
{Devuelve aan mod
mod z.}
z.}
variables
variables r,i:entero
r,i:entero
principio
principio
r:=1;
r:=1;
para
para i:=1
i:=1 hasta
hasta nn hacer
hacer
r:=r*a
r:=r*a
fpara;
fpara;
devuelve
devuelve rr mod
mod zz
fin
fin
Potenciacin de enteros
v
coste = M (m ,i m)
i =1
n 1
cmim
i =1
= cm 2
n 1
i = cm2n 2
i =1
Potenciacin de enteros
v
2
x 25 = x 2x x
( )
x 25 = x 2 x
1 1 x
= x 24 x ;
x 24
( );
x 12
etc.
Potenciacin de enteros
v
funcin
devuelve
entero
funcin pot(a,n,z:entero)
pot(a,n,z:entero)
devuelve
entero
n
{Devuelve
{Devuelve aan mod
mod z.}
z.}
variable
variable r:entero
r:entero
principio
principio
si
si n=0
n=0
entonces
entonces devuelve
devuelve 11
sino
sino
si
si nn es
es impar
impar
entonces
entonces
r:=pot(a,n-1,z);
r:=pot(a,n-1,z);
devuelve
devuelve a*r
a*r mod
mod zz
sino
sino
r:=pot(a,n/2,z);
r:=pot(a,n/2,z);
devuelve
devuelve r*r
r*r mod
mod zz
fsi
fsi
fsi
fsi
fin
fin
(Es un algoritmo de reduccin)
Potenciacin de enteros
v
Es claro que:
0
si n = 0
Potenciacin de enteros
v
funcin
devuelve
entero
funcin potIter(a,n,z:entero)
potIter(a,n,z:entero)
devuelve
entero
n
{Devuelve
{Devuelve aan mod
mod z.}
z.}
variable
variable i,x,r:entero
i,x,r:entero
principio
principio
i:=n;
i:=n; x:=a;
x:=a; r:=1;
r:=1;
mq
mq i>0
i>0 hacer
hacer
si
si ii es
es impar
impar entonces
entonces r:=r*x
r:=r*x mod
mod zz fsi;
fsi;
x:=x*x
x:=x*x mod
mod z;
z;
i:=i
i:=i div
div 22
fmq;
fmq;
devuelve
devuelve rr
fin
fin
Potenciacin de enteros
v
Comentarios finales:
Ni la versin recursiva ni la iterativa del
algoritmo de potenciacin presentadas aqu son
las ptimas, pero ambas son razonablemente
buenas.
Suprimiendo de ambos algoritmos los clculos
mod z, se obtienen algoritmos para elevar un
entero cualquiera a a otro cualquiera n.
Su eficiencia depende, obviamente, del algoritmo
que se utilice para multiplicar enteros grandes.
Si a, n y z son nmeros de 200 cifras:
u
Introduccin a la criptografa
v
El problema:
Eva fue un da al teatro con su vecina Alicia y all
le present a sta a su amigo Roberto.
Introduccin a la criptografa
v
Introduccin a la criptografa
v
Solucin:
Un sistema criptogrfico de clave pblica.
El ms conocido: el sistema RSA.
Introduccin a la criptografa
:
:
:
:
:
() Cmo?
( z, n
J m: mensaje en texto
: a: codificado (ASCII)
(0az-1)
: c: c=an mod z
(c
: a: a=cs mod z ()
: m: mensaje (ASCII)
J Yo tambin
L z, n, c
() Por qu?
Introduccin a la criptografa
v
Clculo de n:
Se genera un valor de n aleatoriamente en (1,z-1).
Despus se intenta calcular s tal que 1sz-1 y
ns mod =1;
u
Introduccin a la criptografa
v
Clculo de s:
Lema. Sean uv>0 y d=mcd(u,v). Entonces
existen a y b tales que au+bv=d.
Dem.: Si u=v entonces d=v, a=0 y b=1.
Si u>v, sea w=u mod v.
En particular w<v.
Se tiene que d=mcd(v,w).
Por induccin, existen a y b tales que av+bw=d.
Luego a=b y b=a-(u div v)b.
algoritmo
algoritmo tot(ent
tot(ent u,v:entero;
u,v:entero;
sal
sal d,a,b:entero)
d,a,b:entero)
{Pre:
{Pre: u,v>0}
u,v>0} {Post:
{Post: d=mcd(u,v)
d=mcd(u,v) d=au+bv}
d=au+bv}
variables
variables w,aa,bb:entero
w,aa,bb:entero
principio
principio
seleccin
seleccin
u=v:
u=v: d:=v;
d:=v; a:=0;
a:=0; b:=1;
b:=1;
u<v:
tot(v,u,d,b,a);
u<v: tot(v,u,d,b,a);
u>v:
u>v: w:=u
w:=u mod
mod v;
v; {w<v}
{w<v} {d=mcd(v,w)}
{d=mcd(v,w)}
tot(v,w,d,aa,bb);
tot(v,w,d,aa,bb);
a:=bb;
a:=bb; b:=aa-(u
b:=aa-(u div
div v)*bb
v)*bb
fseleccin
fseleccin
fin
fin
J. Campos - C.P.S. Esquemas algortmicos - Divide y vencers Pg. 41
Introduccin a la criptografa
Por tanto, para calcular s tal que ns mod =1:
u
u
n, >0
mcd(n,)=1
Calcular s y t tales que ns+t=1.
tot(n,,d,s,t);
tot(n,,d,s,t);
si
si d=1
d=1
entonces
entonces ss es
es el
el buscado
buscado
sino
sino nn no
no es
es bueno
bueno
fsi
fsi
ns + t = 1 ns = 1 t
ns mod = (1 t) mod = 1 0 = 1
Introduccin a la criptografa
v
Introduccin a la criptografa
v
Introduccin a la criptografa
v
Introduccin a la criptografa
v
Cuidado!
En abril de 1994, Atkins, Graff, Lenstra y Leyland
han resuelto el problema propuesto por Gardner
en 1977 (que exiga factorizar un nmero de 129
cifras):
u
u
"
Multiplicacin de matrices
V. Strassen: Gaussian elimination is not optimal,
Numerische Mathematik, 13, pp. 354-356, 1969.
Multiplicacin de matrices
v
m 2 + m3
m1 + m2 + m 5 + m6
AB =
m1 + m 2 + m 4 m7 m 1 + m 2 + m 4 + m5
Multiplicacin de matrices
v
Caso 2n2n:
Si cada elemento de A y B del caso 22 lo
sustituimos por una matriz nn, se pueden
multiplicar dos matrices 2n2n realizando:
u 7 multiplicaciones de matrices de nn, y
u 15 sumas y restas de matrices de nn.
Coste:
Una suma de matrices nn est en (n2).
Suponer que n es potencia de 2; se obtiene la
recurrencia:
( )
T (n) = 7T n 2 + (n 2 )
Y si n no es potencia de 2?
Multiplicacin de matrices
v
Si n no es potencia de 2:
Solucin ms fcil: aadir filas y columnas nulas
hasta que lo sea.
Solucin sugerida por Strassen:
u
Multiplicacin de matrices
v
Calendario de un campeonato
v
El problema:
En una competicin deportiva se enfrentan n
participantes.
Debe confeccionarse un calendario para que cada
participante juegue exactamente una vez con
cada adversario.
Adems, cada participante debe jugar
exactamente un partido diario.
Supongamos, por simplificar, que n=2k.
Calendario de un campeonato
v
644
47444
8
1
2
3
4
participantes 5
6
7
8
1
2
1
4
3
6
5
8
7
2
3
4
1
2
7
8
5
6
3
4
3
2
1
8
7
6
5
4
5
8
7
6
1
4
3
2
5
6
5
8
7
2
1
4
3
6
7
6
5
8
3
2
1
4
7
8
7
6
5
4
3
2
1
Calendario de un campeonato
v
Calendario de un campeonato
v
Calendario de un campeonato
1
1 2
2 1
1
3 4
4 3
1
2
3
4
1
2
1
4
3
2
3
4
1
2
1
5 6
6 5
3
4
3
2
1
1
2
3
4
5
6
7
8
1
7 8
8 7
5
6
7
8
1
2
1
4
3
6
5
8
7
2
3
4
1
2
7
8
5
6
3
4
3
2
1
8
7
6
5
4
5
8
7
6
1
4
3
2
5
6
5
8
7
2
1
4
3
6
7
6
5
8
3
2
1
4
1
6
5
8
7
2
7
8
5
6
3
8
7
6
5
7
8
7
6
5
4
3
2
1
Calendario de un campeonato
tipo
tipo tabla=vector[1..n,1..n-1]
tabla=vector[1..n,1..n-1] de
de 1..n
1..n
algoritmo
algoritmo calendario(sal
calendario(sal t:tabla)
t:tabla)
{Devuelve
de
{Devuelve en
en tt al
al calendario
calendario
de competicin
competicin de
de
k
nn participantes,
con
n=2
,
k>0.}
k
participantes, con n=2 , k>0.}
principio
principio
formarTabla(t,1,n)
formarTabla(t,1,n)
fin
fin
algoritmo
algoritmo formarTabla(sal
formarTabla(sal t:tabla;
t:tabla;
ent
ent inf,sup:1..n)
inf,sup:1..n)
{Forma
{Forma la
la parte
parte de
de tabla
tabla correspondiente
correspondiente aa los
los
enfrentamientos
enfrentamientos de
de los
los participantes
participantes inf..sup}
inf..sup}
variable
variable medio:1..n
medio:1..n
principio
principio
si
si inf:=sup-1
inf:=sup-1
entonces
entonces t[inf,1]:=sup;
t[inf,1]:=sup; t[sup,1]:=inf
t[sup,1]:=inf
sino
sino
medio:=(inf+sup)
medio:=(inf+sup) div
div 2;
2;
formarTabla(t,inf,medio);
formarTabla(t,inf,medio);
formarTabla(t,medio+1,sup);
formarTabla(t,medio+1,sup);
completarTabla(t,inf,medio,
completarTabla(t,inf,medio,
medio,sup-1,medio+1);
medio,sup-1,medio+1);
completarTabla(t,medio+1,sup,
completarTabla(t,medio+1,sup,
medio,sup-1,inf)
medio,sup-1,inf)
fsi
fsi
fin
fin
J. Campos - C.P.S. Esquemas algortmicos - Divide y vencers Pg. 57
Calendario de un campeonato
algoritmo
algoritmo completarTabla(ent/sal
completarTabla(ent/sal t:tabla;
t:tabla;
ent
eqInf,eqSup,
ent eqInf,eqSup,
daInf,daSup,
daInf,daSup,
eqInic:1,,n)
eqInic:1,,n)
{Rellena
{Rellena t[eqInf..eqSup,daInf..daSup]
t[eqInf..eqSup,daInf..daSup] con
con
permutaciones
cclicas
empezando
en
eqInic}
permutaciones cclicas empezando en eqInic}
principio
principio
para
para j:=daInf
j:=daInf hasta
hasta daSup
daSup hacer
hacer
t[eqInf,j]:=eqInic+j-daInf
t[eqInf,j]:=eqInic+j-daInf
fpara;
fpara;
para
para i:=eqInf+1
i:=eqInf+1 hasta
hasta eqSup
eqSup hacer
hacer
t[i,daInf]:=t[i-1,daSup];
t[i,daInf]:=t[i-1,daSup];
para
para j:=daInf+1
j:=daInf+1 hasta
hasta daSup
daSup hacer
hacer
t[i,j]:=t[i-1,j-1]
t[i,j]:=t[i-1,j-1]
fpara
fpara
fpara
fpara
fin
fin
Calendario de un campeonato
v
Coste temporal:
Recurrencia:
( )
T (n) = 2T n 2 + n 2 4
Y si n no es potencia de 2?
Supongamos que est resuelto para n par.
Si n es impar (mayor que 1), no bastan con n-1
das para la competicin, sino que se necesitan n.
Basta con resolver el problema resultante de
aadir un participante (ficticio) ms: el n+1.
Como n+1 es par, podemos calcular el
calendario, que consta de n das.
Una vez resuelto, si al participante i-simo le
toca jugar el da j-simo contra el participante
n+1 (ficticio), eso significa que j es el da de
descanso para el participante i.
Calendario de un campeonato
v
Y si n es par?
Si n div 2 es par, se puede aplicar el algoritmo
formarTabla (visto para el caso n=2k).
Si n div 2 es impar:
Paso 1:
u Se calcula la primera parte de la competicin
para los n div 2 participantes de numeracin
inferior, aadiendo un participante ficticio.
u Se calcula la primera parte de la competicin
para los otros n div 2 participantes ,
aadiendo otro participante ficticio.
Paso 2:
u El da j-simo, 1jn div 2, se hace jugar
entre s a los dos participantes, uno de
numeracin inferior y otro superior, a los
que les haba tocado el j como da de
descanso en el Paso anterior.
Paso 3:
u Se completa el resto de la tabla con
competiciones cruzadas, de forma parecida
a como se hizo en el algoritmo
completarTabla.
Calendario de un campeonato
1
2
1
2
1
3
c
1
c
3
.
.
.
1 2 3
1
2
3
c
2
1
c
3
3
c
1
2
.
.
.
1 2 3
4
5
a
d
c
3
2
1
5
4
d
a
a
d
4
5
d
a
5
4
.
.
.
1 2 3 4 5
1
2
3
4
5
a
2
1
a
5
4
3
3
5
1
a
2
4
1
2
3
4
5
6
7
8
9
10
4
3
2
1
a
5
5
a
4
3
1
2
.
.
.
1 2
a
4
5
2
3
1
6 7 8 9
7
6 10 8
8
b 6 7
9 10 b 6
10 9 7 b
b
8 9 10
10
b
9
8
6
7
b
9
10
7
8
6
1 2
2
1
8
5
4
7
6
3
10
9
4
3
2
1
10
9
8
7
6
5
5
7
4
3
1
10
2
9
8
6
6
4
5
2
3
1
9
10
7
8
8
9
10
6
7
4
5
1
2
3
9
10
6
7
8
3
4
5
1
2
10
6
7
8
9
2
3
4
5
1
7
8
9
10
6
5
1
2
3
4
3
5
1
9
2
8
10
6
4
7