20.03.2015 Views

Tabla de Contenidos

Tabla de Contenidos

Tabla de Contenidos

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

1.2. HEAPS 7<br />

Figura 1.3: Ejemplo <strong>de</strong> Heap<br />

Hasta ahora nuestra <strong>de</strong>finición <strong>de</strong> heap no se diferencia en nada <strong>de</strong> un árbol binario. Lo que<br />

caracteriza a un heap, es que el arreglo A cumple la propiedad <strong>de</strong> heap:<br />

A[P(i)] ≥ A[i] (1.1)<br />

En la figura 1.3 se muestra un ejemplo <strong>de</strong> un árbol binario semicompleto que cumple la propiedad<br />

<strong>de</strong> heap. La anterior propiedad nos dice que en el árbol que representa al heap, el valor asignado a<br />

un nodo es siempre mayor que sus dos hijos. Esta propiedad nos permite también, inmediatamente<br />

dar un procedimiento para obtener el valor máximo <strong>de</strong>ntro <strong>de</strong>l heap:<br />

Heap.Max()<br />

if π > 0<br />

then return A[0]<br />

else return nil<br />

El ejercicio 1 le pi<strong>de</strong> <strong>de</strong>mostrar que este procedimiento es correcto.<br />

Para implementar cada una <strong>de</strong> las operaciones básicas sobre un heap <strong>de</strong>bemos tener claro que,<br />

tanto antes como <strong>de</strong>spués <strong>de</strong> la aplicación <strong>de</strong> cada una <strong>de</strong> ellas, la propiedad <strong>de</strong> heap <strong>de</strong>be cumplirse.<br />

En lo que sigue estudiaremos cómo implementar las operación <strong>de</strong> inserción, y más a<strong>de</strong>lante cómo<br />

restaurar la propiedad <strong>de</strong> heap en un árbol semi-completo <strong>de</strong>ficiente (como heap) lo que nos permitirá<br />

implementar la operación <strong>de</strong> extracción.<br />

Inserción<br />

La operación <strong>de</strong> inserción en un heap se pue<strong>de</strong> hacer <strong>de</strong> una forma bastante simple. El siguiente<br />

trozo <strong>de</strong> código inserta el valor k en un heap.<br />

Heap.Insert(k)<br />

if π = µ<br />

then error “heap overflow”<br />

A[π] := k<br />

i := π<br />

while i > 0 ∧ A[i] > A[P(i)]<br />

do intercambia(A[i],A[P(i)])<br />

i := P(i)<br />

π := π + 1

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!