2. Algoritmo voraces
Algoritmo voraz (también conocido
como goloso, ávido, devorador o greedy) es
una estrategia de búsqueda por la cual se sigue
una heurística consistente en elegir la opción
óptima en cada paso local con la esperanza de
llegar a una solución general óptima. Este
esquema algorítmico es el que menos
dificultades plantea a la hora de diseñar y
comprobar su funcionamiento.
3. Características
Se utilizan generalmente para resolver problemas de
optimización (obtener el máximo o el mínimo). Toman
decisiones en función de la información que está disponible
en cada momento. Una vez tomada la decisión, ésta no
vuelve a replantearse en el futuro. Suelen ser rápidos y
fáciles de implementar. No siempre garantizan alcanzar la
solución óptima.
El enfoque “greedy” no nos garantiza obtener soluciones
óptimas. Por lo tanto, siempre habrá que estudiar la
corrección del algoritmo para demostrar si las soluciones
obtenidas son óptimas o no.
4. Elementos de los que consta la técnica
El conjunto de candidatos, entradas del problema.
Función solución. Comprueba, en cada paso, si el subconjunto actual de candidatos
elegidos forma una solución (no importa si es óptima o no lo es).
Función de selección. Informa cuál es el elemento más prometedor para completar la
solución. Este no puede haber sido escogido con anterioridad. Cada elemento es
considerado una sola vez. Luego, puede ser rechazado o aceptado y pertenecerá
Función de factibilidad. Informa si a partir de un conjunto se puede llegar a una solución.
Lo aplicaremos al conjunto de seleccionados unido con el elemento más prometedor.
Función objetivo. Es aquella que queremos maximizar o minimizar, el núcleo del
problema.
5. Aplicaciones
Una de las más grandes aplicaciones de Heapsort
es construir colas de prioridad con la idea que
busque los procesos que llevan la mayor carga de
prioridad dado una gran cantidad de procesos por
hacer.
En esencia las aplicaciones de Heapsort son las
que traten de sobre ordenar una lista de elementos.
6. Funcionamiento
Este algoritmo consiste en almacenar todos los elementos en un montículo
y luego extraer el nodo que queda como raíz en iteraciones sucesivas
obteniendo el conjunto ordenado. Para esto el método realiza los siguientes
pasos:
1. Se construye el Heap/montículo a partir del arreglo original.
2. La raíz se coloca en el arreglo.
3. El último elemento del montículo se vuelve la raíz.
4. La nueva raíz se intercambia con el elemento de mayor valor de cada
nivel.
5. Tras el paso anterior la raíz vuelve a ser el mayor del montículo.
6. Se repite el paso 2 hasta que quede el arreglo ordenado.
7.
8. Código
Claro para poder aplicar este método es algún software, uno requiere de un código, un cogido que es
un tanto largo, enseguida se le mostrara un ejemplo de código en C++ :
void shiftRight(int* arr, int low, int high)
{
int root = low;
while ((root*2)+1 <= high)
{
int leftChild = (root * 2) + 1;
int rightChild = leftChild + 1;
int swapIdx = root;
/*Check if root is less than left child*/
if (arr[swapIdx] < arr[leftChild])
{
swapIdx = leftChild;
}
/*If right child exists check if it is less than current root*/
if ((rightChild <= high) && (arr[swapIdx] < arr[rightChild]))
9. Este método es conveniente cuando se
trata de ordenar arreglos estáticos
grandes a diferencia de otros métodos
con el Quicksort y el Mergesort.
Heapsort compite primariamente con
Quicksort, otro método de ordenamiento
muy eficiente para propósitos en
general.
Conclusión