Expo fibonacci

31
Estructuras de Datos Avanzadas Diego Sánchez Arthur Oviedo

description

Fibonacci Heaps are efficient data structures that work great for the standard heap operations.

Transcript of Expo fibonacci

Page 1: Expo fibonacci

Estructuras de Datos Avanzadas

Diego SánchezArthur Oviedo

Page 2: Expo fibonacci

AgendaResumen de Heaps Binarios

Fibonacci Heaps

Page 3: Expo fibonacci

Resumen de Heaps BinariosEs un árbol binario casi completo.

Satisface la propiedad de orden del heap ( MAX-Heap: key[hijo] <= key[padre] )

Se representa con un arreglo. – PARENT(i)

• return ⌊i/2⌋ -LEFT(i)• return 2i

– RIGHT(i)• return 2i + 1

Page 4: Expo fibonacci

Heaps BinariosSon utizados para:

Implementar HeapSort (Algoritmo de ordenamiento ) T(n) = O( n log n) S(n) = O(n)

Implementar colas de prioridadUtilizados en algoritmos importantes: Dijkstra

(Ruta mínima en un grafo), Prim( Árbol de expansión mínimo)

Simulación discreta de eventos(Colas de procesos, Colas de impresión)

Page 5: Expo fibonacci

• Mantener la propiedad del heap O(lg n)• Crear un Heap a partir de un conjunto de

elementos dadosO(n)

• Dar mínimo/máximo O(1)• Extraer mínimo/máximo O(lg n)• Incrementar/Decrementar llave O(lg n)• Insertar nodo O(lg n)• Eliminar nodo O(lg n)• Unión de dos heaps O(n)

Resumen de Heaps Binarios

Page 6: Expo fibonacci

Fibonacci Heaps

Page 7: Expo fibonacci

DefiniciónConjunto de árboles ordenados(min-heaps)

Page 8: Expo fibonacci

RepresentaciónUtilizamos listas circulares doblemente enlazadas para

mantener la lista de las raíces de cada árbol: left[x], right[x]

Hay un puntero min[H] hacia el menor elemento del heap

Cada nodo tiene una referencia a su padre p[x]. p[x] = NIL si x es una de las raíces

Cada nodo tiene una referencia a alguno de sus hijos child[x]. child[x] = NIL si el nodo es una hoja

Utilizamos listas circulares doblemente enlazadas para mantener a la lista de hijos de un nodo

n[H] = # de nodos en el Heapdeg[x] = # hijos del nodo x

Page 9: Expo fibonacci

Función Potencial

t(H) = # de árboles en la lista de raíces del heapm(H) = # de nodos marcados del heap

Page 10: Expo fibonacci

D(n)D(n) = Grado (Número de hijos) máximo de

cualquier nodo en un Fibonacci Heap de n nodos.

Costo Extraer mínimo = O(D(n))

D(n) ≤ log N, donde = (1 + 5) / 2

Page 11: Expo fibonacci

Heap de FibonacciOperaciones

Crear heapInsertar nodoUnión de dos Fibonacci HeapsExtraer mínimoDecrementar llaveEliminar nodo

Page 12: Expo fibonacci

Creación de un nuevo HeapMAKE-FIB-HEAP: Reserva espacio para el

heap. n[H] = 0min[H] = NILΦ(H) = 0O(1)

Page 13: Expo fibonacci

Insertar NodoFIB-HEAP-INSERT(H, x)1 degree[x] ← 02 p[x] ← NIL3 child[x] ← NIL4 left[x] ← x5 right[x] ← x6 mark[x] ← FALSE7 concatenate the root list

containing x with root list H8 if min[H] = NIL or key[x] < key[min[H]]9 then min[H] ← x10 n[H] ← n[H] + 1

Page 14: Expo fibonacci

Costo de InserciónComo, t(H′) = t(H)+1 and m(H′) = m(H) Incremento de la función potencial=

((t(H) + 1) + 2 m(H)) - (t(H) + 2 m(H)) = 1.Costo Real = O(1)Costo Amortizado = O(1) + 1 = O(1)

Estamos pagando 1 unidad de costo amortizado constante por cada inserción

Page 15: Expo fibonacci

Dar mínimo elementoFIB-HEAP-MIN(H)1 return min[h]

•Cambio Función potencial = 0•Costo Amortizado = O(1) + 0 = O(1)

Page 16: Expo fibonacci

Unión de dos Fibonacci HeapsFIB-HEAP-UNION(H1, H2)1 H ← MAKE-FIB-HEAP()2 min[H] ← min[H1]3 concatenate the root list of H2 with the root list of H4 if (min[H1] = NIL) or (min[H2] ≠ NIL and min[H2] < min[H1])5 then min[H] ← min[H2]6 n[H] ← n[H1] + n[H2]7 free the objects H1 and H28 return H

Page 17: Expo fibonacci

Costo de UniónCambio Función Potencial = Φ(H) - (Φ(H1) + Φ(H2)) = (t(H) + 2m(H)) - ((t(H1) + 2 m(H1)) + (t(H2) + 2 m(H2))) = 0Costo Amortizado = O(1) + 0 = O(1)

Page 18: Expo fibonacci

Extrayendo el mínimoFIB-HEAP-EXTRACT-MIN(H)1 z ← min[H]2 if z ≠ NIL3 then for each child x of z4 do add x to the root list of H5 p[x] ← NIL6 remove z from the root list of H7 if z = right[z]8 then min[H] ← NIL9 else

min[H] ← right[z]10 CONSOLIDATE(H)11 n[H] ← n[H] - 112 return z

Page 19: Expo fibonacci

Extrayendo el mínimo (Consolidate)CONSOLIDATE(H)1 for i ← 0 to D(n[H])2 do A[i] ← NIL3 for each node w in the root list of H4 do x ← w5 d ← degree[x]6 while A[d] ≠ NIL7 do y ← A[d] ▹ Another node with the same degree as x.8 if key[x] > key[y]9 then exchange x ↔ y10 FIB-HEAP-LINK(H, y, x)11 A[d] ← NIL12 d ← d + 113 A[d] ← x14 min[H] ← NIL15 for i ← 0 to D(n[H])16 do if A[i] ≠ NIL17 then add A[i] to the root list of H18 if min[H] = NIL or key[A[i]] < key[min[H]]19 then min[H] ← A[i]

FIB-HEAP-LINK(H, y, x)1 remove y from the root list of H2 make y a child of x, incrementing degree[x]3 mark[y] ← FALSE

Page 20: Expo fibonacci

Extrayendo el mínimo

Page 21: Expo fibonacci

Costo de extraer mínimoCosto Real

O(D(n)) ->El nodo mínimo máximo tenía D(n) hijos

O(D(n) + t(H)) ->Las raíces que quedan son: Las que ya habían

más los nuevos hijosO(D(n)+t(H))

Cambio en el costo amortizado#Raíces antes = t(H)Máximo número de raíces después = D(n) +1 Cambio de potencial = D(n)+1-t(H)

Costo amortizadoCosto total + Cambio potencial =

O(D(n)+t(H)) + D(n) + 1 - t(H) = O(D(n))

Page 22: Expo fibonacci

Decrementar LlaveFIB-HEAP-DECREASE-KEY(H, x, k)1 if k > key[x]2 then error "new key is greater than current key"3 key[x] ← k4 y ← p[x]5 if y ≠ NIL and key[x] < key[y]6 then CUT(H, x, y)7 CASCADING-CUT(H, y)8 if key[x] < key[min[H]]9 then min[H] ← x

CUT(H, x, y)1 remove x from the child list of y, decrementing degree[y]2 add x to the root list of H3 p[x] ← NIL4 mark[x] ← FALSE

CASCADING-CUT(H, y)1 z ← p[y]2 if z ≠ NIL3 then if mark[y] = FALSE4 then mark[y] ← TRUE5 else CUT(H, y, z)6 CASCADING-CUT(H, z)

Page 23: Expo fibonacci

Decrementar llave:En pocas palabras:

Cambie el valor del nodoSi no se viola la regla del heap,

TerminamosSi se viola:

Separe al hijo del padre y póngalo como raíz Corte en cascada:

Si el nodo está desmarcado, márquelo Si el nodo está marcado,

Córtelo de su padre (póngalo como raíz) Desmarque al nodo Corte en cascada al padre

Page 24: Expo fibonacci

Decrementar Llave

Page 25: Expo fibonacci

Costo de decrementar llaveCosto Real =

O(1) + # de Llamadas recursivas Cascading Cut *O(1) = O(c)

Cambio en la función potencial= ((t(H) + c) ->c Nuevas raíces+ 2(m(H) – c +2)) ->Se desmarcaron

c nodos– ( t(H) + 2m(H) ) = 4-c ->Estado anteriorCosto amortizado=

O(c) + 4 – c = O(1)

Page 26: Expo fibonacci

Eliminar NodoFIB-HEAP-DELETE(H, x)1 FIB-HEAP-DECREASE-KEY(H, x, -∞)2 FIB-HEAP-EXTRACT-MIN(H)

Costo Amortizado = O(decrease-key +extract-min) = O(D(n))

Page 27: Expo fibonacci

Acotando D(n)Recordemos: D(n) = Grado máximo de un

nodo de un heap de n nodos

A probar: D(N) log N, donde = (1 + 5) / 2.

Page 28: Expo fibonacci

Acotando D(n)Lema 1: Sea x un nodo con grado k, y sean

y1, . . . , yk sus k respectivos hijos en el orden en el que fueron añadidos a x: Entonces:

Prueba:-Cuando yi fue unido a x, y1, . . . , yi-1 ya se habían unido a x-degree(x)=i-1-degree(yi) = i - 1 Porque unimos nodos con igual grado (Extract min)-yi ha perdido máximo 1 hijo (Si hubiera perdido 2 ya no sería hijo de x, sino que sería una raíz)-Luego el grado de yi = i-1 ó i-2

Page 29: Expo fibonacci

Acotando D(n)Lema 2:

Lema 3:

Page 30: Expo fibonacci

Acotando D(n)Lema 4:

Sea x cualquier nodo del heap. Sea k = deg[x]. Entonces size(x) >= Fk+2 >=φk

Sk = Tamaño mínimo de un nodo con grado k (1 + suma del tamaño de los hijos)S0=1 S1=2 S2=3 //Casos base

Page 31: Expo fibonacci

Acotando D(n)El máximo grado D(n) de cualquier nodo de

un Fibonacci Heap de n nodos = O(lg n)

Sea x un nodo con grado k.Entoncesn size(x) sk Fk k

n k

log n k