Anda di halaman 1dari 10

Heap

El (binario) estructura de datos del heap es un objeto de matriz que podemos ver como una

rbol binario casi completa (vase la seccin B.5.3), como se muestra en la Figura 6.1. Cada

nodo del rbol corresponde a un elemento de la matriz. El rbol es completamente

llenado en todos los niveles, excepto, posiblemente, el ms bajo, que est lleno de la

la izquierda hasta un punto. Una matriz A que representa un heap es un objeto con dos
atributos:

A: longitud, que (como es habitual) da el nmero de elementos de la matriz, y

A: Heap de tamao, lo que representa cmo se almacenan muchos elementos en la pila dentro
de

matriz A. Es decir, aunque AOE1:: A: longitud puede contener nmeros, slo los elementos

en AOE1:: A:-tamao de la pila, donde 0 A: Heap de tamao A: longitud, son elementos vlidos

del heap. La raz del rbol es AOE1, y dado que el ndice i de un nodo, se

puede calcular fcilmente los ndices de su padre, hijo izquierdo y derecho del nio:

En la mayora de los ordenadores, el procedimiento puede calcular IZQUIERDA 2i en una


instruccin por

simplemente cambiando la representacin binaria de i dada por una posicin de bit. Del
mismo modo, la

procedimiento adecuado puede calcular rpidamente 2i C1 desplazando la representacin


binaria

de que me fui por una posicin de bit y luego aadir en un 1 como el bit de orden inferior. los

procedimiento padre puede calcular bi = 2c desplazando i derecha una posicin de bit. Bueno

implementaciones de heapsort suelen implementar estos procedimientos como "macros" o


"en lnea"

procedimientos.

Hay dos tipos de pilas binarias: max-min-montones y montones. En ambos tipos,

los valores en los nodos satisfacen una propiedad del montculo, los detalles de los cuales
dependen

el tipo de pila. En un max-heap, la propiedad max-heap es que por cada nodo i

aparte de la raz,

AOEPARENT.i / AOEi;

es decir, el valor de un nodo es como mximo el valor de su matriz. Por lo tanto, la mayor

elemento de Amax-heap se almacena en la raz, y el subrbol con raz en un nodo contiene


Los valores no mayores que la contenida en el propio nodo. Una min-heap se organiza en

en sentido contrario; la propiedad min-heap es que por cada nodo i que no sea el

raz,

AOEPARENT.i / AOEi:

El elemento ms pequeo en un min-heap est en la raz.

Para el algoritmo heapsort, utilizamos max-montones. Min-montones implementan


comnmente

colas de prioridad, que se discuten en la Seccin 6.5. Hemos de ser precisos en

especificando si necesitamos un heap max-min-o un heap para cualquier aplicacin particular,

y cuando las propiedades se aplican a cualquiera de max-min-montones o pilas, slo tiene que
utilizar el

trmino "heap".

Ver un heap como un rbol, definimos la altura de un nodo en un heap de ser el

nmero de aristas en el camino hacia abajo sencilla ms larga desde el nodo de la hoja, y

definimos la altura de la pila para ser la altura de su raz. Desde un heap de n elementos

se basa en un rbol binario completo, su altura es, .lg n / (vase el ejercicio 6,1-2).

Veremos que las operaciones bsicas sobre montones ejecutan en el tiempo en la mayor parte
proporcional

a la altura del rbol y as tomar O.lg n / hora. El resto de este captulo

presenta algunos procedimientos bsicos y muestra la forma en que se utilizan en un


algoritmo de clasificacin

y una estructura de datos de prioridad-cola.

El procedimiento MAX-HEAPIFY, que se ejecuta en O.lg n / hora, es la clave para mantener

la propiedad max-heap.

El procedimiento BUILD-MAX-HEAP, que se ejecuta en tiempo lineal, produce una maxheap

a partir de una matriz de entrada desordenada.

El procedimiento HeapSort, que se ejecuta en en LG n / hora, ordena una matriz en

lugar.

El MAX-heap-INSERT, heap-Extract-MAX, heap-AUMENTO-KEY,

y los procedimientos de lixiviacin en mximo, que se ejecutan en O.lg n / tiempo, permiten


que el heap

estructura de datos para implementar una cola de prioridad.


El mantenimiento de la propiedad del montculo

Con el fin de mantener la propiedad max-heap, llamamos al procedimiento MAX-HEAPIFY.

Sus entradas son una matriz A y un ndice i en la matriz. Cuando se le llama, MAXHEAPIFY

asume que los rboles binarios arraigadas en LEFT.i / right.i y / son maxheaps,

pero eso AOEi podra ser ms pequeo que sus hijos, violando de esta manera el max-heap

propiedad. MAX-HEAPIFY deja el valor en AOEi "flotar hacia abajo" en el max-heap por lo

que el subrbol con raz en el ndice i obedece a la propiedad max-heap.

MAX-HEAPIFY.A; yo /

1 l D LEFT.i /

2 r D right.i /

3 Si L A: Heap grande y AOEL> AOEi

4 ms grande D l

5 cosa ms grande i D

6 si r A: Heap grande y Aoer> AOElargest

7 ms grande D r

8 si grande i

9 intercambio AOEi con AOElargest

10 MAX-HEAPIFY.A; grande /

La figura 6.2 ilustra la accin de MAX-HEAPIFY. En cada paso, el ms grande de

los elementos AOEi, AOELEFT.i / y AOERIGHT.i / se determina, y su ndice es

almacenado en grande. Si AOEi es ms grande, entonces el subrbol con raz en el nodo i es ya


una

max-heap y el procedimiento termina. De lo contrario, uno de los dos hijos tiene la

elemento ms grande, y AOEi se intercambia con AOElargest, lo que hace i nodo y su

nios para satisfacer la propiedad max-heap. El nodo indexado por ms grande, sin embargo,

ahora tiene la AOEi valor original, y por lo tanto el subrbol con raz en grande podra violar

la propiedad max-heap. En consecuencia, hacemos un llamado MAX-HEAPIFY de forma


recursiva en ese

subrbol.

El tiempo de ejecucin de MAX-HEAPIFY en un sub-rbol de tamao n arraigado en una


determinada
el nodo i es el, .1 / hora para arreglar las relaciones entre los elementos AOEi,

AOELEFT.i / y AOERIGHT.i /, ms el tiempo para ejecutar MAX-HEAPIFY en un subrbol

enraizada en uno de los hijos del nodo i (suponiendo que se produce la llamada recursiva).

subrboles de los nios tienen cada tamao a lo sumo 2n = 3-el peor de los casos se produce
cuando

el nivel inferior del rbol es exactamente medio lleno y por lo tanto, podemos describir el

el tiempo de funcionamiento de la MAX-HEAPIFY por la recurrencia

T .n / T .2n = 3 / C, 0,1 /:

La solucin a esta recurrencia, por caso 2 del teorema de master (Teorema 4.1),

es T .n / D O.lg n /. Alternativamente, podemos caracterizar el tiempo de ejecucin de


MAXHEAPIFY

en un nodo de la altura h como OH /.

La construccin de un heap

Podemos utilizar el procedimiento MAX-HEAPIFY de manera ascendente para convertir una

matriz AOE1: n, donde n DA: longitud, en un mximo de heap. Por Ejercicio 6.1-7, la

elementos en la submatriz AOE.bn = 2cC1 /: n son todas las hojas del rbol, y as cada uno es

un heap de 1 elemento para empezar. El procedimiento BUILD-MAX-HEAP pasa por

el resto de nodos del rbol y ejecuta MAX-HEAPIFY en cada uno.

CONSTRUIR-MAX-HEAP.A /

1 A: heap-DA tamao: longitud

2 para i D Ba: longitud = 2c downto 1

3-MAX HEAPIFY.A; yo /

La figura 6.3 muestra un ejemplo de la accin de BUILD-MAX en heap.

Para mostrar por qu BUILD-MAX-HEAP funciona correctamente, se utiliza el siguiente bucle

invariante:

Al comienzo de cada iteracin del bucle de las lneas 2-3, cada nodo i C 1;

i C2; :::; N es la raz de un max-heap.

Tenemos que demostrar que esta invariante es cierto antes de la primera iteracin del bucle,
que cada

iteracin del bucle mantiene el invariante, y que el invariante proporciona un til

propiedad para mostrar la correccin cuando el ciclo termina.


Inicializacin: Antes de la primera iteracin del bucle, i d bn = 2c. cada nodo

bn = 2cC1; bn = 2cC2; :::; N es una hoja y es por lo tanto la raz de un trivial max-heap.

Mantenimiento: Para ver que cada iteracin del bucle mantiene el invariante, observar que

los hijos del nodo i se numeran ms alto que yo. Por el invariante de bucle, por lo tanto,

ambos son races de max-montones. Esta es precisamente la condicin necesaria

para la llamada MAX-HEAPIFY.A; i / para realizar ia nodo raz max-heap. Adems,

la llamada MAX-HEAPIFY conserva la propiedad de que los nodos i C 1; i C2; :::; N

son todas las races de max-montones. Decrementar i en el bucle de actualizacin restablece

el invariante de bucle para la siguiente iteracin.

Terminacin: A la terminacin, i D 0. Por el invariante de lazo, cada nodo 1; 2; :::; N

es la raz de un max-heap. En particular, el nodo 1 es.

Podemos calcular un simple lmite superior en el tiempo de ejecucin de BUILD-MAXHEAP

como sigue. Cada llamada a MAX-HEAPIFY cuesta O.lg n / hora, y BUILDMAX-

En HEAP hace que este tipo de llamadas /. Por lo tanto, el tiempo de ejecucin es en LG n
/. Esta

lmite superior, aunque correcta, no es asintticamente apretado.

Podemos derivar una cota ms ajustado mediante la observacin de que el tiempo para MAX-
HEAPIFY de

ejecutar en un nodo vara con la altura del nodo en el rbol, y las alturas de la mayora

nodos son pequeas. Nuestro anlisis ms ajustado se basa en las propiedades que un heap de
n elementos

tiene nc altura BLG (vase el ejercicio 6.1-2) y como mximo

n = 2HC1

linfticos de cualquier altura h

(Vase el ejercicio 6.3-3).

El tiempo requerido por MAX-HEAPIFY cuando se le llama en un nodo de altura h es OH /,

y por lo que podemos expresar el coste total de fabricacin-MAX-HEAP como est acotada

encima de

6.4 El algoritmo heapsort

El algoritmo heapsort comienza utilizando BUILD-MAX-HEAP para construir un max-heap


en la matriz de entrada AOE1:: n, donde n DA: longitud. Dado que el elemento mximo

de la matriz se almacena en el AOE1 raz, podemos ponerlo en su posicin final correcta

mediante el intercambio con AOEn. Si ahora descartamos nodo n del heap, y nosotros

puede hacerlo simplemente decrementar A: heap-size-observamos que los hijos de

la raz permanezca max-montones, pero el nuevo elemento raz podra violar el max-heap

propiedad. Todo lo que tenemos que hacer para restaurar la propiedad max-heap, sin
embargo, es la llamada

MAX-HEAPIFY.A; 1 /, lo que deja un max-heap en AOE1: n 1. El heapsort

algoritmo se repite este proceso para el max-heap de tamao n 1 hasta un heap

de tamao 2. (Vase el ejercicio 6,4-2 para una invariante bucle precisa.)

HEAPSORT.A /

1 Build-MAX-HEAP.A /

2 para i DA: longitud downto 2

3 Intercambio AOE1 con AOEi

4 A: Heap de tamao DA: Heap de tamao 1

5 MAX-HEAPIFY.A; 1 /

La figura 6.4 muestra un ejemplo de la operacin de HeapSort despus de la lnea 1 ha


construido

el max-almacenamiento dinmico inicial. La figura muestra el max-heap antes de la primera


iteracin de

el bucle de las lneas 2-5 y despus de cada iteracin.

El procedimiento lleva tiempo HeapSort en LG n /, ya que la llamada a la acumulacin de


MAXHEAP

lleva un tiempo en / y cada una de las n 1 llama a MAX-HEAPIFY toma

tiempo O.lg n /.

6.5 Colas de prioridad

Heapsort es un excelente algoritmo, pero una buena aplicacin de la ordenacin rpida,


presentado

en el captulo 7, por lo general es mejor que en la prctica. Sin embargo, la estructura de datos
del heap

en s tiene muchos usos. En esta seccin, presentamos una de las aplicaciones ms populares

de un heap: como una cola de prioridad eficiente. Al igual que con montones, colas de
prioridad
vienen en dos formas: las colas de prioridad max-min y colas de prioridad. Nos
concentraremos

aqu en la forma de aplicar las colas de prioridad mxima, que son a su vez basado en
maxheaps;

Ejercicio 6,5-3 le pide que escriba los procedimientos para las colas de prioridad min.

Una cola de prioridad es una estructura de datos para el mantenimiento de un conjunto S de


elementos, cada uno

con un valor asociado llamada una llave. Una cola de prioridad mximo compatible con los
siguientes

operaciones:

INSERT.S; x / inserta el elemento de x en el conjunto S, que es equivalente a la operacin

SDS [fxg.

MAX.S / devuelve el elemento de S con la tecla ms grande.

EXTRACTO DE-MAX.S / elimina y devuelve el elemento de S con la tecla ms grande.

AUMENTAR-KEY.S; x; k / aumenta el valor de clave de elemento de X para el nuevo valor de k,

que se supone que es al menos tan grande como el valor de clave actual de x.

Entre sus otras aplicaciones, podemos utilizar colas max-prioritarias para programar

puestos de trabajo en un ordenador compartido. La cola de prioridad-max realiza un


seguimiento de los trabajos de

realizar y sus prioridades relativas. Cuando un trabajo est terminado o interrumpido,

el planificador selecciona el trabajo de mayor prioridad entre las pendientes llamando

Extract-MAX. El programador puede aadir una nueva tarea a la cola en cualquier momento

llamando INSERT.

Alternativamente, una cola de prioridad-min es compatible con las operaciones de insercin,


MNIMO,

EXTRACTO DE-MIN, y disminuir-KEY. Una cola min-prioridad se puede utilizar en una

impulsada por eventos simulador. Los elementos de la cola son eventos que se desea simular,
cada uno

con un tiempo de ocurrencia asociada que sirve como clave. Los eventos deben ser

simulado con el fin de su tiempo de ocurrencia, porque la simulacin de un evento

puede causar otros eventos que se desea simular en el futuro. Las llamadas a programas de
simulacin

EXTRACTO DE-MIN en cada paso para elegir el prximo evento para simular. A medida que
nuevos eventos son
producido, el simulador los inserta en la cola de prioridad-min llamando INSERT.

Veremos otros usos para las colas min prioridad, destacando la DISMINUCIN-KEY

operacin, en los captulos 23 y 24.

No es sorprendente, podemos usar un heap de implementar una cola de prioridad. En una


aplicacin dada,

tales como la planificacin de tareas o simulacin basada en eventos, elementos de una


prioridad

cola corresponde a los objetos en la aplicacin. Con frecuencia tenemos que determinar qu

objeto de aplicacin corresponde a un elemento de prioridades de colas determinado, y


viceversa.

Cuando usamos un heap de implementar una cola de prioridad, por lo tanto, a menudo
necesitamos

almacenar un identificador para el objeto de la aplicacin correspondiente en cada elemento


del heap. los

composicin exacta de la palanca (tal como un puntero o un nmero entero) depende de la


aplicacin.

Del mismo modo, tenemos que almacenar un identificador para el elemento correspondiente
del heap

en cada objeto de aplicacin. Aqu, el mango sera tpicamente un ndice de matriz.

Puesto que los elementos heap cambian de ubicacin dentro de la matriz durante las
operaciones de almacenamiento dinmico,

una implementacin real, sobre la reubicacin de un elemento del heap, tambin tendra que
actualizar

el ndice de matriz en el objeto de la aplicacin correspondiente. Debido a que los detalles

de acceder a los objetos de aplicacin dependen en gran medida de la aplicacin y su


aplicacin,

no vamos a seguir aqu, aparte de sealar que, en la prctica, estos

manijas necesitan ser mantenidos correctamente.

Ahora se discute cmo implementar las operaciones de una cola de prioridad mxima. los

procedimiento de lixiviacin en MXIMA implementa la operacin mximas en, .1 / hora.

HEAP-MAX.A /

1 retorno AOE1

El procedimiento de lixiviacin en EXTRACTO-MAX implementa la operacin EXTRACTO-MAX.

Es similar a la de cuerpo del bucle (lneas 3-5) del procedimiento HeapSort.


El tiempo de ejecucin del PAFH-EXTRACTO-MAX es O.lg n /, ya que slo se realiza una

cantidad constante de trabajo en la parte superior de la O.lg n / hora para MAX-HEAPIFY.

El procedimiento de lixiviacin en AUMENTO-KEY implementa la operacin aumenta en forma


continua.

Un ndice i en la matriz identifica el elemento prioritario en colas cuya clave que

desee aumentar. El primer procedimiento actualiza la clave del elemento AOEi a su nueva

valor. Debido a que el aumento de la clave de AOEi podra violar la propiedad max-heap,

El procedimiento a continuacin, en una forma que recuerda el bucle de insercin (lneas 5-7)
de

INSERCIN-ORDENAR de la Seccin 2.1, describe una trayectoria simple a partir de este nodo
hacia

la raz para encontrar un lugar adecuado para la clave recin aumentado. Como HEAP-
INCREASEKEY

recorre este camino, se compara repetidamente un elemento a su padre, el intercambio

sus llaves y continua si la clave del elemento es ms grande, y que termina cuando el elemento
de

clave es menor, ya que la propiedad max-heap tiene ahora. (Vase el ejercicio 6.5-5

para una invariante bucle precisa.)

HEAP-AUMENTO-KEY.A; yo; llave/

1 si la clave <AOEi

2 error "nueva clave es menor que clave actual"

tecla 3 AOEi D

4, mientras que i> 1 y AOEPARENT.i / <AOEi

5 AOEi intercambio con AOEPARENT.i /

6 i D PARENT.i /

La figura 6.5 muestra un ejemplo de una operacin de lixiviacin en AUMENTO-KEY. El


funcionamiento

el tiempo de lixiviacin en AUMENTO-clave en un heap de n elementos es O.lg n /, ya que el


camino

trazada desde el nodo actualizado en la lnea 3 a la raz ha O.lg longitud n /.

El procedimiento MAX-heap-INSERT implementa la operacin INSERT. Se necesita

como entrada la clave del nuevo elemento a insertar en max-heap A. El procedimiento

primero se expande al mximo en heap aadiendo al rbol una nueva hoja cuya clave es 1.
A continuacin, llama lixiviacin en AUMENTO-KEY para establecer la clave de este nuevo nodo
para su correcta

valor y mantener la propiedad max-heap.

MAX-heap-INSERT.A; llave/

1 A: Heap de tamao DA: Heap de tamao C 1

2 ': D-tamao de la pila 1

3-HEAP AUMENTO-KEY.A; A: Heap de tamao; llave/

El tiempo de ejecucin de MAX-heap-INSERT en un heap de n elementos es O.lg n /.

En resumen, una pila puede soportar cualquier operacin de prioridad de cola en un conjunto
de tamao n

en O.lg n / hora.

Anda mungkin juga menyukai