Escolar Documentos
Profissional Documentos
Cultura Documentos
El plan:
Conceptos bsicos:
Mtodo agregado
Mtodo contable
Mtodo potencial
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
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).
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.
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
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
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
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).
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.
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.
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
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).
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).
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
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)
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.
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
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;
...
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;
...
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
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.
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).
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.
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
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
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.
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.
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).
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
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.
300
Montculos de Fibonacci
Operacin de borrado de un elemento:
algoritmo borrar(M,x)
principio
reducir(M,x,-);
borrarMnimo(M)
fin
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).
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.
303
Montculos de Fibonacci
Llegamos a la explicacin del nombre de estos montculos
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
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
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
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
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.
308