Você está na página 1de 40

Anlisis amortizado

El plan:
Conceptos bsicos:
Mtodo agregado
Mtodo contable
Mtodo potencial

Primer ejemplo: anlisis de tablas hash dinmicas


Montculos agregables (binomiales y de Fibonacci)
Estructuras de conjuntos disjuntos
Listas lineales auto-organizativas
rboles auto-organizativos ("splay trees")

Tcnicas Avanzadas de Programacin - Javier Campos

269

Montculos de Fibonacci
Qu se pretende?
operacin

mont. binario
(caso peor)

mont. binomial
(caso peor)

mont. Fibonacci
(amortizado)

crear vaco

(1)

(1)

(1)

insertar

(log n)

(log n)

(1)

mnimo

(1)

(log n)

(1)

(log n)

(log n)

(log n)

(n)

(log n)

(1)

reducir clave

(log n)

(log n)

(1)

borrar

(log n)

(log n)

(log n)

borrar mnimo
unin

Tcnicas Avanzadas de Programacin - Javier Campos

270

Montculos de Fibonacci
Situaciones de inters:
Problemas en los que las operaciones de borrado del
mnimo y de borrado de cualquier elemento son poco
frecuentes en proporcin con el resto.
Ejemplo: muchos algoritmos de grafos en los que se
precisan colas con prioridades y con la ejecucin
frecuente de la operacin de reduccin de clave.
Algoritmo de Dijkstra para el clculo de caminos mnimos
(ver transparencias de Esquemas Algortmicos: Algoritmos
voraces, pp. 27-37).
Algoritmo de Prim para el clculo de rboles de
recubrimiento de coste mnimo (ver transparencias de
Esquemas Algortmicos: Algoritmos voraces, pp. 38-46).

Tcnicas Avanzadas de Programacin - Javier Campos

271

Montculos de Fibonacci
Desde un punto de vista prctico:
Las constantes multiplicativas en el coste y la complejidad de su
programacin los hacen menos aconsejables que los montculos
ordinarios en muchas aplicaciones.
Por tanto, salvo que se manejen MUCHAS claves, tienen un
inters eminentemente terico.

Qu son?
Podra decirse que son una versin perezosa de los montculos
binomiales.
Si no se ejecutan operaciones de borrado ni de reduccin de claves
en un montculo de Fibonacci, entonces cada uno de sus rboles es
un rbol binomial.
Tienen una estructura ms relajada, permitiendo retrasar la
reorganizacin de la estructura hasta el momento ms conveniente
para reducir el coste amortizado.

Tcnicas Avanzadas de Programacin - Javier Campos

272

Montculos de Fibonacci
Estructura de un montculo de Fibonacci:
Es un conjunto de rboles parcialmente ordenados, es
decir, la clave de todo nodo es mayor o igual que la de
su padre.
Los rboles no precisan ser binomiales.
Los rboles no estn ordenados.
Se accede por un puntero a la raz de clave mnima.
23

3
18

52

39
Tcnicas Avanzadas de Programacin - Javier Campos

17
38
41

30

24
26

46

35
273

Montculos de Fibonacci
Representacin en memoria:

23

3
18

52

39

17
38
41

30

24
26

46

35

Cada nodo tiene un puntero al padre y un puntero a alguno de sus


hijos.
Los hijos de un nodo se enlazan con una lista circular doblemente
enlazada (cada nodo tiene un puntero a su hermano izquierdo y al
derecho). El orden en esa lista es arbitrario.
Ventaja: se puede eliminar un elemento en O(1) y se pueden juntar
dos listas en O(1).
Tcnicas Avanzadas de Programacin - Javier Campos

274

Montculos de Fibonacci
Representacin en memoria (continuacin):
Adems, cada nodo x contiene:
El nmero de hijos de x: llamado grado.
Un booleano, marca, que indica si el nodo x ha perdido un
hijo desde la ltima vez que x se puso como hijo de otro
nodo.
Los nodos recin creados tienen la marca a falso.
Tambin se pone la marca a falso cuando el nodo se convierte
en hijo de otro nodo.
Veremos para qu sirve la marca ms adelante

Al montculo se accede mediante un puntero que


apunta al elemento mnimo de la lista circular
doblemente encadenada de races de rboles.
El orden de los rboles en la lista de races es
arbitrario.
Tcnicas Avanzadas de Programacin - Javier Campos

275

Montculos de Fibonacci
Definicin de la funcin de potencial:
Notacin: dado un montculo de Fibonacci, M, sea
a(M) el nmero de rboles en la lista de races y m(M)
el nmero de nodos marcados (i.e., con el valor de la
marca igual a verdad).
Definimos el potencial de M como:
P(M) = a(M) + 2m(M)
Ejemplo: el de la figura tiene potencial 5 + 2*3 = 11
23

3
18

52

39

Tcnicas Avanzadas de Programacin - Javier Campos

17
38
41

30

24
26

46

35

276

Montculos de Fibonacci
Hiptesis de trabajo:
Supondremos que el grado mximo de cualquier nodo
en un montculo de Fibonacci de n nodos est acotado
superiormente por D(n).
Luego veremos que D(n) = O(log n).

Operaciones de montculo agregable:


Crear, insertar, ver el mnimo, borrar el mnimo y
unin.
Con estas operaciones un montculo de Fibonacci ser
un conjunto de rboles binomiales desordenados (a
diferencia del montculo binomial).
Tcnicas Avanzadas de Programacin - Javier Campos

277

Montculos de Fibonacci
Definicin: rbol binomial desordenado, Uk:
U0 es un solo nodo
Uk consiste en dos rboles binomiales desordenados Uk-1
enlazados de la siguiente forma: la raz de uno es cualquier hijo
de la raz del otro.

Las propiedades de los rboles binomiales se mantienen


con la siguiente variacin de la cuarta propiedad:
la raz tiene grado k y es el nodo de mximo grado; ms an, los
hijos de la raz son races de subrboles U0, U1, , Uk-1 en algn
orden.

Por tanto: si un montculo de Fibonacci de n nodos es un


conjunto de rboles binomiales desordenados, entonces
D(n) = log n.

Tcnicas Avanzadas de Programacin - Javier Campos

278

Montculos de Fibonacci
Creacin de un montculo de Fibonacci vaco:
Consta de dos campos,
el puntero a la raz mnima: M.min:=nil, y
el nmero de nodos: M.n:=0.

Como a(M) = m(M) = 0, el potencial es tambin 0.


El coste amortizado de la operacin es igual a su coste
real, O(1).

Tcnicas Avanzadas de Programacin - Javier Campos

279

Montculos de Fibonacci
Operacin de insercin de un nuevo nodo:
algoritmo insertar(M,x)
principio
x.padre:=nil;
x.hijo:=nil;
x.izq:=nil;
x.dch:=nil;
x.grado:=0;
x.marca:=falso;
aadir x a la lista de races de M;
si M.min=nil or x.clave<M.min.clave ent
M.min:=x
fsi;
M.n:=M.n+1
fin

El coste real de la operacin es O(1).


Tcnicas Avanzadas de Programacin - Javier Campos

280

Montculos de Fibonacci
Ntese que si se insertan k nodos consecutivos, la lista
de races se incrementa con k rboles de un solo nodo
(a diferencia de los montculos binomiales, en los que
se hace un esfuerzo de compactacin).
Coste amortizado:
Si M es el montculo antes de la insercin y M es el
resultante tras la insercin, a(M) = a(M) + 1 y m(M) = m(M)
por lo que el incremento del potencial es 1.
Por tanto, el coste amortizado de la operacin es:
A(M) = C(M) + P(M) P(M) = O(1) + 1 = O(1).

Tcnicas Avanzadas de Programacin - Javier Campos

281

Montculos de Fibonacci
Operacin de busqueda del elemento de clave
mnima:
El nodo de clave mnima es precisamente el apuntado
por M.min, por tanto el coste real de la operacin es
O(1).
Como el potencial no cambia, el coste amortizado es
tambin O(1).

Tcnicas Avanzadas de Programacin - Javier Campos

282

Montculos de Fibonacci
Operacin de unin de montculos de Fibonacci:
algoritmo unin(M1,M2,M)
principio
crearVaco(M);
M.min:=M1.min;
concatenar la lista de races de M2 con la de M;
si M.min=nil or (M2.minnil and M2.min<M1.min) ent
M.min:=M2.min
fsi;
M.n:=M1.n+M2.n
fin

Tampoco hay compactacin.


Coste real: O(1).
Tcnicas Avanzadas de Programacin - Javier Campos

283

Montculos de Fibonacci
Cambio del potencial con la operacin de unin:
P(M) (P(M1) + P(M2))
= (a(M) + 2m(M)) ((a(M1) + 2m(M1)) + (a(M2) + 2m(M2)))
=0
porque a(M) = a(M1) + a(M2) y m(M) = m(M1) + m(M2)

Coste amortizado:
A(M) = C(M) + P(M) (P(M1) + P(M2)) = O(1)

Tcnicas Avanzadas de Programacin - Javier Campos

284

Montculos de Fibonacci
Operacin de borrado del elemento con clave
mnima (es en la que se compactan los rboles):
algoritmo borrarMnimo(M)
principio
z:=M.min;
si znil ent
para todo x hijo de z hacer
aadir x a la lista de races de M;
x.padre:=nil;
fpara;
borrar z de la lista de races de M;
si z=z.dch ent M.min:=nil
sino
M.min:=z.dch; compactar(M)
fsi;
M.n:=M.n-1
fsi
fin
Tcnicas Avanzadas de Programacin - Javier Campos

285

Montculos de Fibonacci
El algoritmo compactar debe juntar las races de
igual grado hasta conseguir que haya como mucho una
raz de cada grado (as se reduce el nmero de rboles
en el montculo), y ordena las races por grado.
Para compactar, repetimos los siguientes pasos hasta
que todas las races de la lista de races del montculo
tengan distinto grado:
Buscar dos races x e y con igual grado y con la clave de x
menor o igual que la clave de y.
Enlazar y a x:
borrar y de la lista de races y hacer que y sea hijo de x
(algoritmo enlazar);
se incrementa el grado de x y la marca de y se pone a falso.

Tcnicas Avanzadas de Programacin - Javier Campos

286

Montculos de Fibonacci
Veamos primero el algoritmo enlazar:
algoritmo enlazar(M,y,x)
{borrar y de la lista de races
y hacer que sea hijo de x}
principio
borrar y de la lista de races de M;
poner y como hijo de x;
x.grado:=x.grado+1;
y.marca:=falso
fin

Tcnicas Avanzadas de Programacin - Javier Campos

287

Montculos de Fibonacci
Y ahora el algoritmo compactar:
Se utiliza un vector auxiliar A[0..D(n)], donde n es el nmero
de datos del montculo; A[i] = y significa que y es una raz
con grado i.
algoritmo compactar(M)
principio
para i:=0 hasta D(M.n) hacer
inicializar A
A[i]:=nil
fpara;
para todo w en la lista de races de M hacer
x:=w;
d:=x.grado; se procesa toda raz w (copiada en x);
...
al final, A[x.grado] = x
A[d]:=x;
fpara;
...

Tcnicas Avanzadas de Programacin - Javier Campos

288

Montculos de Fibonacci
Veamos el procesamiento de cada raz w:
...
para todo w en la lista de races de M hacer
x:=w; d:=x.grado;
inicialmente era nil, si no lo es
mq A[d]nil hacer
hay otras races de grado d
y:=A[d];
si x.clave>y.clave ent
intercambiar(x,y)
hay que enlazar x e y
fsi;
enlazar(M,y,x);
el nodo y ya no es una raz
A[d]:=nil;
d:=d+1
el nodo x tiene un hijo ms (y)
fmq;
ahora seguro que no hay otra raz con
A[d]:=x;
igual grado que x
fpara;
...

Tcnicas Avanzadas de Programacin - Javier Campos

289

Montculos de Fibonacci
Y ya slo queda reconstruir la lista de races a partir de la
informacin del vector A:
...
M.min:=nil;
para i:=0 hasta D(M.n) hacer
si A[i]nil ent
aadir A[i] a la lista de races de M;
si M.min=nil
or A[i].clave<M.min.clave ent
M.min:=A[i]
fsi
fsi
fpara
fin

Tcnicas Avanzadas de Programacin - Javier Campos

290

Montculos de Fibonacci
Hay que verificar que la operacin de borrado
mantiene los rboles del montculo en la clase de los
binomiales desordenados:
En la operacin borrarMnimo todo hijo x de z se convierte
en raz de un nuevo rbol, pero esos hijos son a su vez
rboles binomiales desordenados (por la propiedad cuarta).
En la operacin de compactacin se enlazan parejas de
rboles binomiales desordenados de igual grado, el resultado
es un nuevo rbol binomial desordenado de grado una unidad
mayor.

Tcnicas Avanzadas de Programacin - Javier Campos

291

Montculos de Fibonacci
Coste amortizado del borrado del elemento mnimo
Primero hay que calcular el coste real:
Algoritmo borrarMnimo: O(D(n))
Algoritmo compactar:
los bucles primero y tercero tienen un coste O(D(n))
el bucle intermedio:
Antes de ejecutar compactar el tamao de la lista de
races es como mucho D(n) + a(M) 1, es decir, el
tamao antes de empezar la operacin, a(M), menos el
nodo raz extrado, ms los hijos del nodo extrado, que
son como mucho D(n).
En cada ejecucin del mq interno una raz se enlaza con
otra, por tanto el coste total es como mucho proporcional a
D(n) + a(M).

Luego el coste real es O(D(n) + a(M))

Tcnicas Avanzadas de Programacin - Javier Campos

292

Montculos de Fibonacci
Coste amortizado del borrado del mnimo (cont.)
Despus hay que calcular el potencial
Antes de extraer el mnimo el potencial es a(M) + 2m(M).
Despus, es como mucho: (D(n) + 1) + 2m(M), porque quedan
como mucho D(n) + 1 races y no se marcan nodos durante la
operacin.

El coste amortizado es, por tanto:


A(M) = C(M) + P(M) P(M)
= O(D(n) + a(M)) + ((D(n) + 1) + 2m(M) a(M) + 2m(M))
= O(D(n))

La demostracin de que D(n) = O(log n) vendr ms tarde

Tcnicas Avanzadas de Programacin - Javier Campos

293

Montculos de Fibonacci
Operacin de reduccin del valor de una clave:
Vemos antes un subalgoritmo auxiliar:
Corta el enlace entre un nodo y su padre, convirtiendo al hijo
en raz.
algoritmo cortar(M,x,y)
principio
borrar x de la lista de hijos de y,
reduciendo y.grado;
aadir x a la lista de races de M;
x.padre:=nil;
x.marca:=falso
fin

Tcnicas Avanzadas de Programacin - Javier Campos

294

Montculos de Fibonacci
El algoritmo de reduccin de una clave:
algoritmo reducir(M,x,c)
{pre:c<x.clave}{post:la clave de x pasa a ser c}
principio
hay que
x.clave:=c;
re-estructurar
y:=x.padre;
el rbol
si ynil and x.clave<y.clave ent
cortar(M,x,y);
x pasa a ser una raz de M
cortar_arriba(M,y)
el nodo y acaba
fsi;
de perder un hijo,
si x.clave<M.min.clave ent
entonces
M.min:=x
lo vemos a continuacin
fsi
fin

Tcnicas Avanzadas de Programacin - Javier Campos

295

Montculos de Fibonacci
Cortar_arriba, una versin recursiva de cortar:
Si y es una raz entonces el algoritmo no hace nada.
Si y no est marcado,
algoritmo cortar_arriba(M,y)
el algoritmo lo marca
principio
y deja de subir.
z:=y.padre;
si znil ent
Si y est marcado,
si y.marca=falso ent
se corta, y se llama
y.marca:=verdad
a si mismo subiendo
sino
hacia el padre.
cortar(M,y,z);
En definitiva: un nodo
cortar_arriba(M,z)
fsi
est marcado cuando ha
fsi
perdido el 1er hijo pero
fin
no ha perdido el 2.

Tcnicas Avanzadas de Programacin - Javier Campos

296

Montculos de Fibonacci
Para qu vale la marca de los nodos?
Suponer que un nodo x sufre la siguiente historia:
en algn momento, x fue raz;
entonces, x se enlaz con otro nodo;
despus, dos hijos de x se eliminaron de su lista de hijos
mediante cortes.

Tan pronto como x pierde su 2 hijo, x se corta de su padre y


pasa a ser raz.
El campo marca es verdad si han ocurrido los dos primeros
pasos pero no ha perdido an el 2 hijo.

Tcnicas Avanzadas de Programacin - Javier Campos

297

Montculos de Fibonacci
Coste amortizado de la reduccin de una clave:
Primero: calcular el coste real
El algoritmo reducir tiene un coste del mismo orden que
cortar_arriba.
Suponer que cortar_arriba se ejecuta recursivamente c veces
en una llamada desde reducir, como cada llamada a
cortar_arriba solo cuesta O(1) ms la nueva llamada
recursiva, el coste de reducir es O(c).

Tcnicas Avanzadas de Programacin - Javier Campos

298

Montculos de Fibonacci
Segundo: calcular el cambio de potencial
Sea M el montculo antes de reducir la clave.
Cada llamada recursiva a cortar_arriba, excepto la ltima,
corta un nodo marcado y lo desmarca.
Despus de reducir quedan a(M) + c rboles en el
montculo: los a(M) originales, los c 1 que se han
cortado y el de raz x
Despus de reducir quedan como mucho m(M) c + 2
nodos marcados: c 1 se desmarcan con la llamada y uno
puede marcarse en la ltima llamada recursiva.
Por tanto, el cambio de potencial est acotado por:
((a(M) + c) + 2(m(M) c + 2)) (a(M) + 2m(M)) = 4 c

Luego el coste amortizado es, como mucho:


A(M) = C(M) + P(M) P(M) = O(c) + 4 c = O(1)
podemos escalar las unidades del potencial para
dominar la constante escondida en O(c)
Tcnicas Avanzadas de Programacin - Javier Campos

299

Montculos de Fibonacci
Ahora vemos el porqu de esa funcin de potencial
Cuando un nodo marcado y se corta en una operacin de
cortar_arriba, su marca desaparece, luego el potencial se
reduce en 2 unidades (P(M) = a(M) + 2m(M)).
Una de esas unidades paga por el corte y por quitar la marca
y la otra unidad compensa el incremento de potencial en una
unidad por el hecho de que y pasa a ser raz de un nuevo
rbol.

Tcnicas Avanzadas de Programacin - Javier Campos

300

Montculos de Fibonacci
Operacin de borrado de un elemento:
algoritmo borrar(M,x)
principio
reducir(M,x,-);
borrarMnimo(M)
fin

Es igual que para los montculos binomiales.


El algoritmo hace decrecer el valor de la clave del
elemento a borrar hasta el valor mnimo posible con el
algoritmo reducir, en tiempo (amortizado) O(1).
Despus, con la operacin de borrado del mnimo, de
coste (amortizado) O(D(n)), se borra esa raz.
El coste total (amortizado) es, por tanto, O(D(n)).
Tcnicas Avanzadas de Programacin - Javier Campos

301

Montculos de Fibonacci
Falta ver que el grado, D(n), de cualquier nodo
de un montculo de Fibonacci de n nodos est
acotado por O(log n).
Ya vimos que si todos sus rboles son rboles
binomiales desordenados, entonces D(n) = log n.
Pero los cortes del algoritmo reducir pueden hacer
que los rboles dejen de ser binomiales
desordenados.
Veremos ahora que, dado que un nodo se corta de su
padre tan pronto como pierde dos hijos, se sigue
teniendo que D(n) es O(log n).

Tcnicas Avanzadas de Programacin - Javier Campos

302

Montculos de Fibonacci
Lema 1: Sea x un nodo cualquiera de grado k de un
montculo de Fibonacci, con hijos y1, y2, , yk (en el
orden en que fueron enlazados). Se tiene:
y1.grado 0, y
yi.grado i 2, para i = 2, 3, , k.

Demostracin: La primera afirmacin es obvia.


Veamos la segunda:
Cuando yi (i 2) fue enlazado a x, los otros y1, y2, , yi1 ya
eran hijos de x, por tanto x.grado i 1.
El nodo yi se enlaza a x slo si x.grado = yi.grado, por
tanto yi.grado i 1 en el momento de enlazarse.
Desde enlazarse a x, yi slo ha podido perder como mucho un
hijo, de lo contrario (si hubiese perdido dos hijos) se habra
cortado de x, por tanto yi.grado i 2.
Tcnicas Avanzadas de Programacin - Javier Campos

303

Montculos de Fibonacci
Llegamos a la explicacin del nombre de estos montculos

Lema 2: Sea x un nodo cualquiera de grado k de un


montculo de Fibonacci. Sea card(x) el nmero de
nodos del subrbol con raz x (incluido x).
Entonces:
card ( x) Fk 2 k , donde :
si k 0
0,
Fk 1,
si k 1 es el k simo n de Fibonacci, y
Fk 1 Fk 2 , si k 2
1 5 2 es la razn area ( 1'61803...).

Tcnicas Avanzadas de Programacin - Javier Campos

304

Montculos de Fibonacci
Demostracin del Lema:
Sea sk el valor mnimo de card(z) para todos los z con
z.grado = k.
Por tanto: s0 = 1, s1 = 2, s2 = 3, sk card(x).
Sean y1, y2, , yk los hijos de x (en el orden en que fueron
enlazados).
Por el Lema 1, se tiene:
k

card ( x) sk 2 si 2
i 2

(1 por el nodo x + 1 por y1)

Tcnicas Avanzadas de Programacin - Javier Campos

305

Montculos de Fibonacci
Demostracin del Lema (cont.):
Veamos un resultado previo para los Fk:
k

Fk 2 1 Fi , para k 0
i 0

Demostracin: por induccin sobre k.


k = 0: F2 = 1 + F0 = 1 + 0 = 1
Suponiendo que
k 1

Fk 1 1 Fi
i 0

se tiene:
k
k 1
Fk 2 Fk Fk 1 Fk 1 Fi 1 Fi
i 0
i 0

Tcnicas Avanzadas de Programacin - Javier Campos

306

Montculos de Fibonacci
Demostracin del Lema (cont.):
Ahora veamos por induccin sobre k que sk Fk+2 para todo k
no negativo.
Para k = 0 y k = 1 es trivial.
Sea k 2. Supngase que si Fi+2 para i = 0, 1, , k 1.
Entonces:
k

i2

i 2

i 0

sk 2 si 2 2 Fi 1 Fi Fk 2
Slo falta ver que Fk+2 k.
Se puede demostrar (ejercicio) a partir del resultado:

Fi

i i

1 5
, donde
2
5

que, a su vez, puede demostrarse por induccin a partir de la


definicin.
Tcnicas Avanzadas de Programacin - Javier Campos

307

Montculos de Fibonacci
Corolario (del Lema 2): El grado mximo, D(n) de
cualquier nodo de un montculo de Fibonacci de n
nodos es O(log n).
Demostracin:
Sea x un nodo cualquiera y k = x.grado.
Por el Lema 2, n card(x) k. Por tanto: k log n, y se
sigue el resultado.

Tcnicas Avanzadas de Programacin - Javier Campos

308

Você também pode gostar