Una estructura heap es un rbol binario completo o casi completo y parcialmente ordenado. (No confundir este concepto con el de la ona de memoria dinmica llamada heap! Completo significa "ue tiene #aspecto triangular$% es decir "ue contiene un nodo en la ra&% dos en el nivel siguiente% y as& sucesivamente teniendo todos los niveles ocupados totalmente con una cantidad de nodos "ue debe ser '. Casi completo significa "ue tiene todos los niveles menos el de las ho(as #saturados$% ocupados con )%'%*%+%),% etc. Nodos- en el nivel de las ho(as puede no cumplirse esta condici.n% pero los nodos e/istentes deben estar ubicados #a i"uierda$. E(emplo0 #1arcialmente ordenado$ significa "ue se cumple% o bien "ue para cada nodo del rbol los valores de sus nodos hi(os (si los tuviera! son ambos menores o iguales "ue el del nodo padre (y se llama rbol heap de m&nimo!% o bien "ue los valores de sus hi(os son ambos mayores o iguales "ue los de su nodo padre (y se llama rbol heap de m/imo!. Entre los hi(os no se e/ige ning2n orden en particular. E(emplo0 3a estructura "ue hemos representado arriba se almacena en un array% del siguiente modo0 ' )4 + )5 )' )) )6 64 '7 '8 Considerando "ue las posiciones del array son 4% )% ...n9)% se verifica "ue las posiciones de los nodos hi(os con respecto a su nodo padre cumplen 0 1adre en posici.n k :; Hi(os en posiciones 2*k+1 y 2*k+2 Anlogamente% si el hi(o est en posici.n h% su padre estar en posici.n (h-1)/2 , considerando cociente entero. En estas estructuras las operaciones bsicas son0 a) Etraer ra!" Esta operaci.n se lleva a cabo de la siguiente forma0 <e remueve la ra& <e reemplaa el nodo removido por la 2ltima ho(a <e restaura el heap o mont&culo% es decir se compara el valor de la nueva ra& con el de su hi(o menor (si es un mont&culo ordenado de esta forma! y se realia el eventual intercambio% y se prosigue comparando )=7 Arbol binario completo Arbol binario casi completo Arbol Heap Estructura Heap Algoritmos II curso Calvo hacia aba(o el valor trasladado desde la ra& hasta llegar al nivel de las ho(as o hasta ubicar el dato en su posici.n definitiva. E(emplo0 En el mont&culo del e(emplo anterior eliminamos la ra& y la reemplaamos Ahora se analia la situaci.n de la nueva ra& con respecto a sus hi(os0 >ueda0 Ahora el problema se traslad. al nodo con '8 y sus nuevos hi(os% )) y )6 >ueda finalmente el heap o mont&culo restaurado '=7 <e reemplaa ' por '8 <e elimina el nodo ho(a con '8 El menor de los hi(os es +% "ue es menor "ue '8% por lo cual se intercambia con ?l El menor de los hi(os es ))% "ue es menor "ue '8. Entonces% '8 se intercambia con )) Estructura Heap Algoritmos II curso Calvo @bservar "ue para restaurar el mont&culo y ubicar el valor "ue se ha colocado en la ra& en su posici.n definitiva se lleva a cabo% a lo sumo un par de comparaciones y un intercambio hasta llegar al nivel de las ho(as. Como el rbol est completo o casi completo% su altura es apro/imadamente log ' N . As& "ue% en el peor caso% para restaurar el mont&culo% el n2mero de #pasos$ (entendiendo por paso el par de comparaciones ms el eventual intercambio! es apro/imadamente log ' N. Aener en cuenta "ue estas etapas "ue se han mostrado con el diagrama de rbol% en realidad se llevan a cabo en el array en el cual est implementado el rbol heap. 1or lo tanto% considerando la estructura del array% se realia lo siguiente0 ' )4 + )5 )' )) )6 64 '7 '8 <ituaci.n inicial del heap. N:)4 '8 )4 + )5 )' )) )6 64 '7 '8 <e reemplaa ' por '8. N:8 '8 )4 + )5 )' )) )6 64 '7 '8 <e compara '8 con sus hi(os (la posici.n se determina como se indic. antes! + )4 '8 )5 )' )) )6 64 '7 '8 <e intercambia '8 con el menor de sus hi(os. + )4 '8 )5 )' )) )6 64 '7 '8 <e analia ahora la situaci.n de '8 con respecto a sus #nuevos$ hi(os$. + )4 '8 )5 )' )) )6 64 '7 '8 <e intercambia '8 con ))% el menor de sus hi(os + )4 )) )5 )' '8 )6 64 '7 '8 El mont&culo ha sido restaurado. Ahora N:8 b) A#re#ar nue$o elemento " El nuevo elemento se ubica como #2ltima ho(a$. 3uego se restaura el mont&culo analiando ternas #hacia arriba$ hasta ubicar el nuevo elemento en su posici.n definitiva0 E(emplo0 6=7 <e agrega el valor 8 al heap% como 2ltima ho(a Estructura Heap Algoritmos II curso Calvo Ahora el mont&culo debe ser restaurado0 Analiamos la situaci.n e/istente entre 8 y su nodo padre% (s.lo dos nodos por"ue 8 ha "uedado como hi(o i"uierdo de )'! >ueda0 Ahora el anlisis se debe realiar entre 8% y su padre% )4. Besulta Ahora se analia la situaci.n de 8% y su padre +. *=7 Como 8 es menor "ue )'% se intercambia con ?l Como 8 es menor "ue )4% se intercambia con ?l Estructura Heap Algoritmos II curso Calvo Como 8 supera a + el proceso termina. Esto se realia% como se indic. antes% en el array. Entonces% es. + )4 )) )5 )' '8 )6 64 '7 8 <e almacena 8 como nueva ho(a% es decir% se pone a continuaci.n del 2ltimo valor almacenado en el array. Ce esta forma% N% n2mero de elementos del array% pasa de 8 a )4. + )4 )) )5 )' '8 )6 64 '7 8 <e analia la situaci.n de 8 con respecto a su padre. + )4 )) )5 8 '8 )6 64 '7 )' Como 8 es menor "ue )'% se intercambian los valores. + )4 )) )5 8 '8 )6 64 '7 )' Ahora se analia la situaci.n de 8 con respecto a su padre )4 + 8 )) )5 )4 '8 )6 64 '7 )' Como 8 es menor "ue )4% se intercambian los valores. + 8 )) )5 )4 '8 )6 64 '7 )' <e analia la situaci.n de 8 con respecto a +- como se verifica la condici.n del heap% no se realia intercambio% y el proceso concluye. + 8 )) )5 )4 '8 )6 64 '7 )' El heap o mont&culo ha sido restaurado. @bservar "ue% anlogamente a lo sucedido en el caso de la e/tracci.n de la ra&% al agregar un nuevo elemento% se realia una comparaci.n y un eventual intercambio desde el nivel de las ho(as hasta el nivel de la ra&. Es decir "ue % considerando "ue la altura del rbol es apro/imadamente log ' N% se llevarn a cabo log ' N pasos (cada paso consiste en una comparaci.n y un eventual intercambio!. 1or eso se indica "ue las operaciones de alta y e/tracci.n de ra& en una estructura heap o mont&culo tienen un costo temporal @(log N!. 5=7 Estructura Heap Algoritmos II curso Calvo %so de la estructura heap"
Esta estructura es muy eficiente para implementar ACA cola con prioridad y para ordenar arrays. &ola con prioridad" Es un ACA cuyas primitivas son0 &reaci'n de la Cola con 1rioridad (estrucci'n de la Cola con 1rioridad Alta de un elemento Etracci'n del mnimo elemento (el de mayor prioridad! Como se puede apreciar% a un coste de logN se puede resolver mediante la implementaci.n en heap% las primitivas de Alta y E/tracci.n del D&nimo (corresponde a e/tracci.n de la ra&! Aplicaci'n al ordenamiento de arra)s" el heapsort. Este m?todo de ordenamiento tiene ' partes 0 En la primera parte se convierte el array en un mont&culo% reubicando los elementos del mismo. En la segunda parte% en sucesivas etapas intercambia el elemento de la ra& con la 2ltima ho(a% decrementa la posici.n considerada 2ltima del array y recompone el mont&culo desde la primera posici.n del array (posici.n de la ra&! hasta la 2ltima considerada (recompone el mont&culo en una ona del array "ue va disminuyendo paulatinamente!. Al agotarse los elementos del array "ue se consideran parte del mont&culo% el proceso termina. @bservar "ue si se "uiere ordenar el array de modo ascendente% el mont&culo debe verificar "ue el valor de cada nodo debe ser mayor "ue el de sus hi(os% y lo contrario para un ordenamiento descendente. &'di#o del *eapsort" void Heapsort( int aEF% int n ! G int H% /- for (H : n='- H ;: )- H99! Becomponer(a% H% n!- Ihile (n ; )! G / : aE)F- aE)F : aEnF- aEnF : /- Becomponer(a% )% 99n!- J J void Becomponer( int aEF% int i"u% int der! G int i% (% /- / : aEi"uF- i : i"u- ( : 'Ki- if ((( L der! MM (aE(F L aE(N)F!! (NN- Ihile ((( L: der! MM (/ L aE(F!! G aEiF : aE(F- i : (- ( : 'K(- if ((( L der! MM (aE(F L aE(N)F!! (NN- J aEiF : /- J E(emplo0 Este es el array original ,=7 Estructura Heap Algoritmos II curso Calvo 6 ' ) 8 7 , 3as siguientes son las etapas de la conformaci.n del heap 6 ' , 8 7 ) 6 8 , ' 7 ) 8 6 , ' 7 ) 8 7 , ' 6 ) Ahora ya se tiene un mont&culo formado. <e lleva a cabo la segunda parte. ) 7 , ' 6 8 7 ) , ' 6 8 7 6 , ' ) 8 ) 6 , ' 7 8 , 6 ) ' 7 8 ' 6 ) , 7 8 6 ' ) , 7 8 ) ' 6 , 7 8 ' ) 6 , 7 8 ) ' ) , 7 8 7=7