Lección
La teoría — Montículo binario: una cola de prioridad en un vector
Un montículo binario de mínimos es un vector en el que la clave de cada posición i no supera a las claves de las posiciones 2i + 1 y 2i + 2, sus hijos; el padre de la posición i está en ⌊(i − 1) / 2⌋. Interpretado así, el vector representa un árbol binario completo, cuya clave menor siempre está en la posición 0, la raíz. Para insertar una clave, colócala al final y hazla ascender: intercámbiala con su padre mientras sea menor que él. Para extraer la menor, lleva la última clave a la raíz y hazla descender: intercámbiala con el menor de sus hijos mientras ese hijo sea menor que ella. Un montículo utilizado de esta forma es una cola de prioridad.
Qué significa cada símbolo
n- número de claves del montículo
i- posición en el vector, contando desde 0
h- altura de una posición: número de niveles que tiene debajo, ⌊log₂(n / (i + 1))⌋
- Supone
- Una comparación contrasta una clave con otra, y un intercambio permuta las claves de dos posiciones. Llevar la última clave a la raíz durante una extracción no cuenta como ninguna de esas operaciones. Una clave igual a su padre o al menor de sus hijos permanece donde está; si los dos hijos son iguales, se elige el izquierdo. El montículo mantiene la clave menor en la raíz. En un montículo de máximos se invierte el sentido de todas las comparaciones. Puedes usar hasta quince claves entre 0 y 99, para que el árbol entero quepa en la pantalla de un móvil. Los órdenes que se cuentan en la última fila corresponden a claves distintas.
Problema resuelto al detalle
-
¿Cuántas comparaciones cuesta cada método con un millar de claves? 4 pasos
Pulsa Descendente: inserción y después Descendente: desde abajo, y explica de dónde salen 34 y 22. Considera ahora 1.023 claves que llegan de mayor a menor. ¿Cuántas comparaciones hace cada método?
Abre este problema en la herramienta
-
La posición i tiene profundidad ⌊log₂(i + 1)⌋: una posición a profundidad 0, dos a profundidad 1, cuatro a profundidad 2 y ocho a profundidad 3. Si llegan de mayor a menor, cada clave nueva es la menor hasta ese momento y asciende hasta la raíz, con una comparación y un intercambio por nivel: 0 + 2 · 1 + 4 · 2 + 8 · 3 = 34.
-
Al construir desde el último padre, lo que cuenta es la altura: 3 para la raíz, 2 para las posiciones 1 y 2, 1 para las cuatro posiciones de profundidad 2 y 0 para las ocho hojas. La suma es 11. Con las claves de mayor a menor, cada una desciende todo lo posible. Como con quince claves todos los padres tienen dos hijos, cada nivel cuesta dos comparaciones: 22 comparaciones y 11 intercambios.
-
1.023 = 2¹⁰ − 1 corresponde a un árbol binario perfecto de diez niveles, con 2ᵈ posiciones a profundidad d. La inserción una a una cuesta la suma de las profundidades: 1 · 2 + 2 · 4 + 3 · 8 + ⋯ + 9 · 512 = 8.194 comparaciones y otros tantos intercambios.
-
La construcción desde el último padre cuesta el doble de la suma de las alturas. Hay 2⁹ posiciones de altura 0, 2⁸ de altura 1, y así sucesivamente hasta la raíz, de altura 9: 1 · 256 + 2 · 128 + ⋯ + 9 · 1 = 1.013, que es 1.023 menos los diez dígitos 1 de su representación binaria. El doble da 2.026 comparaciones, con 1.013 intercambios.
Respuesta
8.194 comparaciones al insertar una a una y 2.026 al construir desde el último padre: unas ocho por clave frente a dos. La mayoría de las posiciones de un montículo tienen mucha profundidad y poca altura. El coste de insertar depende de la profundidad; el de construir desde el último padre, de la altura. La herramienta admite hasta quince claves, para las que este mismo cálculo da las 34 y 22 comparaciones que muestra.
-
Ruta de aprendizaje
Qué operaciones abarata una estructura de datos
Referencias (2)
- Heapsort as first published: J. W. J. Williams, "Algorithm 232: Heapsort," Communications of the ACM 7(6), 347–348, June 1964.
- The heap-based sort published six months later, close to the version used today: Robert W. Floyd, "Algorithm 245: Treesort 3," Communications of the ACM 7(12), 701, December 1964.