Montón de fibonacci

El montón de Fibonacci ( eng.  Fibonacci heap ) es una estructura de datos que es un conjunto de árboles ordenados de acuerdo con la propiedad de una pirámide no decreciente. Michael Fredman y Robert Tarjan introdujeron los montones de Fibonacci en 1984 .

La estructura es una implementación del tipo de datos abstracto " Priority Queue " , y es notable porque las operaciones que no requieren eliminación tienen un tiempo de ejecución amortizado de (para un montón binario y un montón binomial , el tiempo de ejecución amortizado es ). Además de las operaciones estándar , , , el montón de Fibonacci le permite realizar la operación de fusionar dos montones a la vez. INSERTMINDECREASE-KEYUNION

Estructura

Operaciones

Creando un nuevo montón de Fibonacci

El procedimiento Make_Fib_Heap devuelve un objeto de montón de fibonacci y = NULL. No hay árboles .

El costo amortizado de un procedimiento es igual a su costo real .

Insertando un Nodo

Fib_Heap_Insert 1 ← 0 2 ← NULO 3 ← NULO 4 ← 5 ← 6 ← FALSO 7 Adjuntar una lista de raíces que contiene , a una lista de raíces 8 si = NULL o 9 entonces ← 10 ← + 1

El costo amortizado de un procedimiento es igual a su costo real .

Encontrar el nodo mínimo

El procedimiento Fib_Heap_Minimum devuelve un archivo .

El costo amortizado de un procedimiento es igual a su costo real .

Unión de dos montones de Fibonacci

Fib_Heap_Union 1 ← Hacer_Fib_Heap() 2 ← 3 Agregar una lista de raíces a una lista de raíces 4 si ( = NULL) o ( ≠ NULL y < ) 5 luego ← 6 ← 7 Suelta objetos y 8 regresa

El costo amortizado de un procedimiento es igual a su costo real .

Extrayendo el nodo mínimo

Fib_Heap_Extract_Min 1 ← 2 si ≠ NULL 3 luego para cada hijo del nodo 4 haga Add to root list 5 ← NULL 6 Eliminar de la lista raíz 7 si = 8 entonces ← NULL 9 más ← 10 Consolidar 11 ← 12 volver

En una de las etapas de la operación de extracción del nodo mínimo, se realiza la compactación ( ing.  consolidación ) de la lista de raíces . Para ello, utilice el procedimiento de ayuda de Consolidar. Este procedimiento utiliza una matriz auxiliar . Si , entonces actualmente es una raíz con grado .

Consolidar 1 para ← 0 a 2 hacer ← NULL 3 for para cada nodo en la lista raíz 4 do ← 5 ← 6 while ≠ NULL 7 do ← //Nodo con el mismo grado que 8 si 9 luego intercambia ↔ 10 Fib_Heap_Link 11 ← NULL 12 ← 13 ← 14 ← NULO 15 para ← 0 a 16 hacer si ≠ NULL 17 luego agregar a la lista raíz 18 si = NULL o 19 luego ← Fib_Heap_Link 1 Eliminar de la lista raíz 2 Crear nodo secundario , incrementar 3 ← FALSO

El costo amortizado de extraer el nudo mínimo es .

Tecla decreciente

Fib_Heap_Decrease_Key 1 si 2 entonces error "La nueva clave es mayor que la actual" 3 ← 4 ← 5 si ≠ NULL y 6 luego Cortar 7 Cascading_Cut 8 si 9 entonces ← Cortar 1 Eliminar de la lista de nodos secundarios , reducir 2 Agregar a la lista de raíces 3 ← NULL 4 ← FALSO Cascading_Cut 1 ← 2 si ≠ NULL 3 entonces si = FALSO 4 entonces ← VERDADERO 5 más Cortar 6 Cascading_Cut

El costo amortizado de la reducción clave no excede .

Eliminar un nodo

Fib_Heap_Delete 1 Fib_Heap_Decrease_Key ∞ 2 Fib_Heap_Extract_Min

El tiempo de ejecución amortizado del procedimiento es de .

Véase también

Enlaces

Literatura