Saltar al contenido

La construcción lineal

La biblioteca estándar de C++ ofrece make_heap, que construye un heap en O(n) con el algoritmo de bajar desde el último padre. Rust convierte un Vec en BinaryHeap con BinaryHeap::from, también en O(n). Las dos garantías vienen de la misma cuenta: muchos nodos abajo que bajan poco.

Para un heap de 31 valores (5 niveles llenos), compara el trabajo de las dos formas de construirlo: bajar desde el último padre, y subir cada valor al insertarlo, suponiendo que los valores llegan de mayor a menor en un min-heap y cada uno sube hasta la raíz. Cuenta intercambios.

Con 31 valores (5 niveles llenos), ¿cuántos intercambios hace como máximo construir el heap bajando desde el último padre? ¿Y cuántos haría insertarlos uno a uno en el peor caso, con cada valor subiendo hasta la raíz?