Min-heap en C: ejercicio resuelto
Min-heap en C: ejercicio resuelto
Si buscas min-heap en C ejercicio resuelto, aquí tienes la implementación completa con array: inserción O(log n), extracción del mínimo O(log n) y la operación de heapify que mantiene la propiedad de heap.
Un min-heap es un árbol binario completo donde cada nodo es menor o igual que sus hijos. Se representa eficientemente con un array: el hijo izquierdo del nodo i está en 2*i+1, el derecho en 2*i+2 y el padre en (i-1)/2.
Enunciado
Implementa un min-heap con capacidad fija que soporte:
insertar(heap, valor): inserta un elemento y restaura la propiedad.extraer_min(heap): elimina y devuelve el elemento mínimo.imprimir(heap): muestra el array interno.
Inserta los valores {5, 3, 8, 1, 4, 2} y extrae el mínimo tres veces.
Solución en C
Resultado esperado
Errores frecuentes
- Calcular mal los índices de hijos y padre: hijo izquierdo =
2*i+1, hijo derecho =2*i+2, padre =(i-1)/2. Con indexación en 1 las fórmulas son distintas. - No decrementar
tamañoantes de llamar abajarenextraer_min: sitamañono se reduce, el último elemento que se colocó en la raíz se compara consigo mismo. - Confundir min-heap con max-heap: en min-heap el padre es menor que los hijos; en max-heap es al revés. Solo cambia el signo de la comparación.
- No validar que el heap no esté vacío antes de
extraer_min: acceder adatos[0]contamaño == 0es comportamiento indefinido.
Aplicación práctica
El min-heap es la estructura subyacente de las colas de prioridad, usadas en el algoritmo de Dijkstra, en la codificación de Huffman, en la planificación de tareas por prioridad y en el algoritmo de ordenación heapsort.
Siguiente ejercicio recomendado
- Heap sort en C: ejercicio resuelto
- Cola en C: ejercicio resuelto
- Dijkstra en C: ejercicio resuelto
- Todos los ejercicios de C
Práctica guiada y libro completo
Si quieres una ruta completa con progresión real de dificultad:
FAQ
¿Por qué se usa un array y no un árbol con punteros para el heap?
Porque el árbol binario completo se mapea perfectamente a un array sin necesidad de punteros: los índices de padre e hijos se calculan aritméticamente. Esto reduce el consumo de memoria, mejora la localidad de caché y simplifica el código.
¿Qué es la operación de heapify (o build-heap)?
Convierte un array arbitrario en un heap válido en O(n) aplicando bajar a todos los nodos internos de abajo a arriba (desde n/2 - 1 hasta 0). Es más eficiente que insertar los n elementos uno a uno (que costaría O(n log n)).
¿Cómo convertir un min-heap en max-heap?
Solo hay que invertir las comparaciones: en subir, cambiar <= por >=; en bajar, cambiar < por >. El resto del código permanece idéntico.