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
- El montón de Fibonacci es una colección de árboles .
- Cada árbol en está sujeto a la propiedad del montón ( ing. min-heap property ): la clave de cada nodo no es menor que la clave de su nodo padre.
- Cada nodo contiene los siguientes punteros y campos
:
- - el campo en el que se almacena la clave;
- — puntero al nodo principal;
- — un puntero a uno de los nodos secundarios;
- - puntero al nodo hermano izquierdo;
- - puntero al nodo hermano derecho;
- - un campo que almacena el número de nodos secundarios;
- — un valor booleano que indica si el nodo ha perdido algún nodo secundario desde que se convirtió en un nodo secundario de algún otro nodo.
- Los nodos secundarios se combinan con la ayuda de punteros y en una lista cíclica doblemente enlazada de nodos secundarios ( ing. child list ) .
- Las raíces de todos los árboles están conectadas por medio de punteros y en una lista cíclica de raíces doblemente enlazada ( eng. root list ).
- Para todo el montón de Fibonacci, también se almacena un puntero al nodo con la clave mínima , que es la raíz de uno de los árboles. Este nodo se llama nodo mínimo .
- El número actual de nodos en se almacena en .
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
- Thomas H. Kormen et al.Algoritmos : construcción y análisis. - 2ª ed. - M. : Williams Publishing House , 2007. - S. 1296. - ISBN 5-8459-0857-4 .
- Mehlhorn, Kurt, Sanders, Peter. 6.2.2 Montones de Fibonacci // Algoritmos y estructuras de datos: la caja de herramientas básica. - Springer, 2008. - 300 págs. — ISBN 978-3-540-77978-0 .