estructuras de datos clase 11 – colas con prioridadmlg/ed/downloads/clases...

of 56/56
Estructuras de Datos Clase 11 – Colas con prioridad Dr. Sergio A. Gómez http://cs.uns.edu.ar/~sag Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur Bahía Blanca, Argentina

Post on 01-Dec-2018

214 views

Category:

Documents

0 download

Embed Size (px)

TRANSCRIPT

  • Estructuras de Datos

    Clase 11 Colas con prioridad

    Dr. Sergio A. Gmezhttp://cs.uns.edu.ar/~sag

    Departamento de Ciencias e Ingeniera de la Computacin

    Universidad Nacional del Sur

    Baha Blanca, Argentina

  • ADT Cola con prioridad Una cola con prioridad almacena una coleccin de

    elementos que soporta:

    Insercin de elementos arbitraria

    Eliminacin de elementos en orden de prioridad

    (el elemento con 1era prioridad puede ser

    eliminado en cualquier momento)

    Nota: Una cola con prioridad almacena sus elementos

    de acuerdo a su prioridad relativa y no expone una

    nocin de posicin a sus clientes.

    Estructuras de datos - Dr. Sergio A. Gmez 2

  • Claves y prioridades Clave: Atributo de un individuo que sirve para

    identificarlo en un conjunto de individuos

    Ejemplo: DNI, Nmero de libreta para alumnos.

    Ejemplo: Nmero de afiliado para afiliados a una obra social.

    Ejemplo: Nmero de cuenta para una cuenta en un banco.

    Prioridad: Atributo de un individuo que sirve para pesar al individuo en un conjunto de individuos

    Ejemplo: Promedio de un alumno

    Ejemplo: Cantidad de dinero depositado en el banco por el cliente

    Ejemplo: Cantidad de aos que una persona es cliente de un negocio.

    Estructuras de datos - Dr. Sergio A. Gmez 3

  • Comparacin de claves con rdenes

    totales Una cola con prioridad necesita un criterio de comparacin

    que sea un orden total para poder resolver siempre la comparacin entre prioridades.

    Sea S un conjunto y una relacin binaria en S, entonces (S, ) es un orden total ssi:

    Reflexivo: para todo k en S, vale k k

    Antisimtrico: para todo k1, k2 en S, vale que si k1k2 y k2k1 entonces k1=k2

    Transitivo: para todo k1, k2, k3 en S, vale que si k1k2 y k2k3entonces k1 k3

    Nota: Si (S, ) es un orden total, todos los pares de elementos de S son comparables entre s mediante .

    Nota: en los reales y los enteros y para cadenas de texto (comparacin alfabtica) son rdenes totales.

    Estructuras de datos - Dr. Sergio A. Gmez 4

  • Cola con prioridad Una cola con prioridad es un coleccin de elementos,

    llamados valores, los cuales tienen asociada una clave que es provista en el momento que el elemento es insertado.

    Un par clave-valor insertado en un cola con prioridad se llama una entrada.

    Operaciones fundamentales de una cola con prioridad P:

    insert(k, x): Inserta un valor x con clave k en P

    removeMin(): Retorna y remueve de P una entrada con la clave ms pequea

    Estructuras de datos - Dr. Sergio A. Gmez 5

  • EntradasProblema: Cmo asociar claves con valores?

    Estructuras de datos - Dr. Sergio A. Gmez 6

    public interface Entry {

    public K getKey(); // Retorna la clave de la entrada

    public V getValue(); // Retorna el valor de la entrada

    }

    public class Entrada implements Entry {

    private K clave;

    private V valor;

    public Entrada(K k, V v) { clave = k; valor = v; }

    public K getKey() { return clave; }

    public V getValue() { return value; }

    public void setKey( K k ) { clave = k; }

    public void setValue(V v) { value = v; }

    }

  • ADT ComparadorProblema: Cmo comparar claves de tipo genrico K?

    compare(a,b) = Retorna un entero i tal que:

    ib

    Ocurre un error si a y b no pueden ser comparados.

    Est especificado por la interfaz java.util.Comparator.

    Estructuras de datos - Dr. Sergio A. Gmez 7

  • Ejemplo de Comparadorpublic class Persona { // Archivo: Persona.java

    protected String nombre;

    otros atributos

    public Persona(String nombre ) { this.nombre = nombre; }

    public String getNombre() { return nombre; }

    otras operaciones

    }

    public class ComparadorPersona // Genericidad restringida

    implements java.util.Comparator { // Archivo: ComparadorPersona.java

    public int compare( E a, E b ) { // Comparo las personas por su nombre

    return a.getNombre().compareTo(b.getNombre());

    }

    }

    public class Test { // Archivo: Test.java

    public static void main( String [] args ) {

    Persona p1 = new Persona( Sergio );

    Persona p2 = new Persona( Toms );

    ComparadorPersona comp = new ComparadorPersona();

    if( comp.compare( p1, p2 ) < 0 ) System.out.println( p1 es menor que p2 );

    else System.out.println( p1 es mayor que p2 );

    }

    }Estructuras de datos - Dr. Sergio A. Gmez 8

  • Comparador por defecto

    Estructuras de datos - Dr. Sergio A. Gmez 9

    El comparador por defecto delega su comportamiento en el comportamiento de la

    operacin compareTo del tipo bsico E:

    public class DefaultComparator

    implements java.util.Comparator {

    public int compare( E a, E b ) {

    return a.compareTo( b );

    }

    }

    public class Test2 {

    public static void main( String [] args ) {

    Integer x1 = 5, x2 = 1;

    DefaultComparator comp = new DefaultComparator();

    System.out.println( "comp(x1,x2): " + comp.compare(x1, x2)); // retorna 1

    String s1 = "pedro", s2 = "pablo";

    DefaultComparator comp2 = new DefaultComparator();

    System.out.println( "comp(s1,s2): " + comp2.compare(s1, s2)); // retorna 4

    Float f1 = 5.3f, f2 = 21.8f;

    DefaultComparator comp3 = new DefaultComparator();

    System.out.println( "comp(f1,f2): " + comp3.compare(f1, f2)); // retorna -1

    }

    }

  • ADT Cola con PrioridadDada una cola con prioridad P:

    size(): Retorna el nmero de entradas en P.

    isEmpty(): Testea si P es vaca

    min(): Retorna (pero no remueve) una entrada de P con la clave ms pequea; ocurre un error si P est vaca.

    insert(k,x): Inserta en P una entrada con clave k y valor x; ocurre un error si k es invlida (i.e. no se puede comparar con otras claves).

    removeMin(): Remueve de P y retorna una entrada con la clave ms pequea; ocurre una condicin de error si P est vaca.

    Estructuras de datos - Dr. Sergio A. Gmez 10

  • Interfaz Cola con prioridad en Java

    Estructuras de datos - Dr. Sergio A. Gmez 11

    /** K representa el tipo de la prioridad del objecto de tipo V almacenado en la

    cola con prioridad*/

    public interface PriorityQueue {

    /** Retorna el nmero de tems en la cola con prioridad. */

    public int size();

    /** Retorna si la cola con prioridad est vaca. */

    public boolean isEmpty();

    /** Retorna pero no elimina una entrada con minima prioridad. */

    public Entry min() throws EmptyPriorityQueueException;

    /**Inserta un par clave-valor y retorna la entrada creada.*/

    public Entry insert(K key, V value) throws InvalidKeyException;

    /** Remueve y retorna una entrada con minima prioridad. */

    public Entry removeMin() throws EmptyPriorityQueueException;

    }

  • Estructuras de datos - Dr. Sergio A. Gmez 12

    public class Principal {

    public static void main(String[] args) {

    // Creo una cola con prioridad implementada con un Heap

    // con prioridades de tipo entero y valores de tipo string.

    // El constructor recibe el tamao y el comparador de prioridades.

    PriorityQueue cola = new Heap( 20,

    new DefaultComparator() );

    try {

    cola.insert(40, "Sergio"); // Inserto a Sergio con prioridad 40.

    cola.insert(30, "Martin"); // Inserto a Martn con prioridad 30.

    cola.insert(15, "Matias"); // Inserto a Matas con prioridad 15.

    cola.insert(5, "Carlos"); // Inserto a Carlos con prioridad 5.

    cola.insert(100, "Marta"); // Inserto a Marta con prioridad 100.

    // Imprimo la entrada con mnima prioridad: (5, Carlos).

    System.out.println( Min: + cola.min() );

    // Vaco la cola: puede lanzar EmptyPriorityQueueException

    while ( !cola.isEmpty() ){

    Entry e = cola.removeMin();

    System.out.println( "Entrada: " + e);

    } // Salen las prioridades: 5, 15, 30, 40 y 100 en ese orden.

    } catch(InvalidKeyException e) { e.printStackTrace();

    } catch(EmptyPriorityQueueException e) { e.printStackTrace(); }

    } }

  • Implementacin de cola con prioridad con

    listas

    Mtodo Lista no ordenada Lista ordenada

    size, isEmpty O(1) O(1)

    insert O(1) O(n)

    min, removeMin O(n) O(1)

    Estructuras de datos - Dr. Sergio A. Gmez 13

    Lista no ordenada:

    insert: Se inserta al principio de la lista

    min, removeMin: Para hallar el mnimo o removerlo es necesario

    recorrer toda la lista

    Lista ordenada:

    insert: Para insertar en forma ordenada es necesario recorrer

    toda la lista en el peor caso

    min, removeMin: El mnimo es el primer elemento de la lista.

    Nota: Ver fragmentos de cdigo 8.7 y 8.8 de [GT].

  • Cola con prioridad implementada con Heap

    Un (mn)heap es un rbol binario que almacena una coleccin de entradas en sus nodos y satisface dos propiedades adicionales:

    Propiedad de orden del heap (rbol parcialmente ordenado): En un heap T, para cada nodo v distinto de la raz, la clave almacenada en v es mayor o igual que la clave almacenada en el padre de v.

    Propiedad de rbol binario completo: Un heap T con altura h es un rbol binario completo si los nodos de los niveles 0,1,2,,h-1 tienen el mximo nmero de nodos posibles y en el nivel h-1 todos los nodos internos estn a la izquierda de las hojas y si hay un nodo con un hijo, ste debe ser un hijo izquierdo (y el nodo debiera ser el nodo interno de ms a la derecha).

    Estructuras de datos - Dr. Sergio A. Gmez 14

  • Ejemplo de MnHeap con altura 3

    Estructuras de datos - Dr. Sergio A. Gmez 15

    5

    10 7

    50 12

    67 71

    23 97

    75

    Nota: Se muestran slo las claves de las entradas

    Nota: La propiedad de orden del heap hace que las prioridades de los

    hijos son mayores a la de su padre.

    Nota: La propiedad de rbol binario completo hace que el ltimo nivel

    se llene de izquierda a derecha.

    Nivel 0

    Nivel 1

    Nivel 2

    Nivel 3

  • Ejemplo de MxHeap

    Estructuras de datos - Dr. Sergio A. Gmez 16

    50

    40 7

    23 12

    6 1

    2 6

    5

    Nota: Se muestran slo las claves de las entradas.

    Nota: Las prioridades de los hijos son menores a las de su padre.

    Nota: Para lograr esto en el cdigo que veremos tengo que

    personalizar el comportamiento del comparador de prioridades.

  • Altura del heap Propiedad: Un heap T con n entradas tiene una altura

    h = log .

    Justificacin: Como T es completo, la cantidad n de nodos mnima se da con nivel h-1 lleno y hay un nodo en nivel h:

    1 + 2 + 4 + + 2 + 1 = 2-1+ 1 = 2.

    Luego, log .

    La cantidad n de nodos es mxima cuando el nivel h est lleno:

    1 + 2 + 4 + + 2 = 2 1

    Luego, log + 1 1.

    Por lo tanto, como h es entero, entonces h = log .

    Estructuras de datos - Dr. Sergio A. Gmez 17

  • Mtodo insert(k,x)

    Estructuras de datos - Dr. Sergio A. Gmez 18

    cola.insert( 20 )20

  • Mtodo insert(k,x)

    Estructuras de datos - Dr. Sergio A. Gmez 19

    cola.insert( 20 )

    cola.insert( 45 )20

    45

  • Mtodo insert(k,x)

    Estructuras de datos - Dr. Sergio A. Gmez 20

    cola.insert( 20 )

    cola.insert( 45 )

    cola.insert( 30 )

    20

    45 30

  • Mtodo insert(k,x)

    Estructuras de datos - Dr. Sergio A. Gmez 21

    cola.insert( 20 )

    cola.insert( 45 )

    cola.insert( 30 )

    cola.insert( 16 )

    20

    45 30

    16

    16 es menor a 45 y viola la propiedad de orden

    parcial => hay que intercambiarlos

  • Mtodo insert(k,x)

    Estructuras de datos - Dr. Sergio A. Gmez 22

    cola.insert( 20 )

    cola.insert( 45 )

    cola.insert( 30 )

    cola.insert( 16 )

    20

    16 30

    45

    16 es menor a 20 y viola la propiedad de orden

    parcial => hay que intercambiarlos

  • Mtodo insert(k,x)

    Estructuras de datos - Dr. Sergio A. Gmez 23

    cola.insert( 20 )

    cola.insert( 45 )

    cola.insert( 30 )

    cola.insert( 16 )

    16

    20 30

    45

    16 ya lleg a la raz => ya termin la insercin

  • Mtodo insert(k,x)

    Estructuras de datos - Dr. Sergio A. Gmez 24

    cola.insert( 20 )

    cola.insert( 45 )

    cola.insert( 30 )

    cola.insert( 16 )

    cola.insert( 18 )

    16

    20 30

    45

    18 es menor que 20 => hay que intercambiarlos

    18

  • Mtodo insert(k,x)

    Estructuras de datos - Dr. Sergio A. Gmez 25

    cola.insert( 20 )

    cola.insert( 45 )

    cola.insert( 30 )

    cola.insert( 16 )

    cola.insert( 18 )

    16

    18 30

    45

    18 es mayor que 16 => termin

    20

  • Mtodo insert(k,x)

    Estructuras de datos - Dr. Sergio A. Gmez 26

    cola.insert( 20 )

    cola.insert( 45 )

    cola.insert( 30 )

    cola.insert( 16 )

    cola.insert( 18 )

    cola.insert( 33 )

    16

    18 30

    45

    33 es mayor que 30 => termin

    20 33

  • Mtodo insert(k,x)

    Estructuras de datos - Dr. Sergio A. Gmez 27

    cola.insert( 20 )

    cola.insert( 45 )

    cola.insert( 30 )

    cola.insert( 16 )

    cola.insert( 18 )

    cola.insert( 33 )

    cola.insert( 25 )

    16

    18 30

    45

    25 es menor que 30 => los intercambio

    20 33 25

  • Mtodo insert(k,x)

    Estructuras de datos - Dr. Sergio A. Gmez 28

    cola.insert( 20 )

    cola.insert( 45 )

    cola.insert( 30 )

    cola.insert( 16 )

    cola.insert( 18 )

    cola.insert( 33 )

    cola.insert( 25 )

    16

    18 25

    45

    25 es mayor que 16 => termin

    20 33 30

  • Mtodo removeMin()

    Estructuras de datos - Dr. Sergio A. Gmez 29

    cola.insert( 20 )

    cola.insert( 45 )

    cola.insert( 30 )

    cola.insert( 16 )

    cola.insert( 18 )

    cola.insert( 33 )

    cola.insert( 25 )

    e cola.removeMin()

    16

    18 25

    45

    e ser 16 porque est en la raz

    La raz se reemplaza con la hoja ms profunda y

    ms a la derecha (es decir el ltimo nodo del

    recorrido por niveles)

    20 33 30

  • Mtodo removeMin()

    Estructuras de datos - Dr. Sergio A. Gmez 30

    cola.insert( 20 )

    cola.insert( 45 )

    cola.insert( 30 )

    cola.insert( 16 )

    cola.insert( 18 )

    cola.insert( 33 )

    cola.insert( 25 )

    e cola.removeMin() // 16

    30 es mayor que que 18 y que 25

    Intercambio 30 por el menor de sus hijos (18)

    30

    18 25

    45 20 33

  • Mtodo removeMin()

    Estructuras de datos - Dr. Sergio A. Gmez 31

    cola.insert( 20 )

    cola.insert( 45 )

    cola.insert( 30 )

    cola.insert( 16 )

    cola.insert( 18 )

    cola.insert( 33 )

    cola.insert( 25 )

    e cola.removeMin() // 16

    18

    30 25

    45

    30 es mayor que 20

    Intercambio 30 por el menor de sus hijos (20)

    20 33

  • Mtodo removeMin()

    Estructuras de datos - Dr. Sergio A. Gmez 32

    cola.insert( 20 )

    cola.insert( 45 )

    cola.insert( 30 )

    cola.insert( 16 )

    cola.insert( 18 )

    cola.insert( 33 )

    cola.insert( 25 )

    e cola.removeMin() // 16

    18

    20 25

    45

    30 lleg a una hoja => termin

    30 33

  • Mtodo removeMin()

    Estructuras de datos - Dr. Sergio A. Gmez 33

    cola.insert( 20 )

    cola.insert( 45 )

    cola.insert( 30 )

    cola.insert( 16 )

    cola.insert( 18 )

    cola.insert( 33 )

    cola.insert( 25 )

    e cola.removeMin() // 16

    e cola.removeMin() // 18

    18

    20 25

    45

    Reemplazo 18 por 33 (hoja ms profunda y ms

    a la derecha)

    30 33

  • Mtodo removeMin()

    Estructuras de datos - Dr. Sergio A. Gmez 34

    cola.insert( 20 )

    cola.insert( 45 )

    cola.insert( 30 )

    cola.insert( 16 )

    cola.insert( 18 )

    cola.insert( 33 )

    cola.insert( 25 )

    e cola.removeMin() // 16

    e cola.removeMin() // 18

    33

    20 25

    45

    33 es mayor a 20 y 25 => intercambio 33 con el

    menor de sus hijos (el 20)

    30

  • Mtodo removeMin()

    Estructuras de datos - Dr. Sergio A. Gmez 35

    cola.insert( 20 )

    cola.insert( 45 )

    cola.insert( 30 )

    cola.insert( 16 )

    cola.insert( 18 )

    cola.insert( 33 )

    cola.insert( 25 )

    e cola.removeMin() // 16

    e cola.removeMin() // 18

    20

    33 25

    45

    33 es mayor a 30 => intercambio 33 con el

    menor de sus hijos (el 30)

    30

  • Mtodo removeMin()

    Estructuras de datos - Dr. Sergio A. Gmez 36

    cola.insert( 20 )

    cola.insert( 45 )

    cola.insert( 30 )

    cola.insert( 16 )

    cola.insert( 18 )

    cola.insert( 33 )

    cola.insert( 25 )

    e cola.removeMin() // 16

    e cola.removeMin() // 18

    20

    30 25

    45

    33 lleg a una hoja => termin

    33

  • Mtodo removeMin()

    Estructuras de datos - Dr. Sergio A. Gmez 37

    cola.insert( 20 )

    cola.insert( 45 )

    cola.insert( 30 )

    cola.insert( 16 )

    cola.insert( 18 )

    cola.insert( 33 )

    cola.insert( 25 )

    e cola.removeMin() // 16

    e cola.removeMin() // 18

    e cola.removeMin() // 20

    20

    30 25

    45

    Reemplazo 20 por ltimo nodo (el 33)

    33

  • Mtodo removeMin()

    Estructuras de datos - Dr. Sergio A. Gmez 38

    cola.insert( 20 )

    cola.insert( 45 )

    cola.insert( 30 )

    cola.insert( 16 )

    cola.insert( 18 )

    cola.insert( 33 )

    cola.insert( 25 )

    e cola.removeMin() // 16

    e cola.removeMin() // 18

    e cola.removeMin() // 20

    33

    30 25

    45

    33 es mayor a 30 y a 25 => reemplazo 33 por el

    25

  • Mtodo removeMin()

    Estructuras de datos - Dr. Sergio A. Gmez 39

    cola.insert( 20 )

    cola.insert( 45 )

    cola.insert( 30 )

    cola.insert( 16 )

    cola.insert( 18 )

    cola.insert( 33 )

    cola.insert( 25 )

    e cola.removeMin() // 16

    e cola.removeMin() // 18

    e cola.removeMin() // 20

    25

    30 33

    45

    33 lleg a una hoja => termin

  • Mtodo removeMin()

    Estructuras de datos - Dr. Sergio A. Gmez 40

    cola.insert( 20 )

    cola.insert( 45 )

    cola.insert( 30 )

    cola.insert( 16 )

    cola.insert( 18 )

    cola.insert( 33 )

    cola.insert( 25 )

    e cola.removeMin() // 16

    e cola.removeMin() // 18

    e cola.removeMin() // 20

    e cola.removeMin() // 25

    25

    30 33

    45

    Reemplazo 25 por ltimo nodo (el 45)

  • Mtodo removeMin()

    Estructuras de datos - Dr. Sergio A. Gmez 41

    cola.insert( 20 )

    cola.insert( 45 )

    cola.insert( 30 )

    cola.insert( 16 )

    cola.insert( 18 )

    cola.insert( 33 )

    cola.insert( 25 )

    e cola.removeMin() // 16

    e cola.removeMin() // 18

    e cola.removeMin() // 20

    e cola.removeMin() // 25

    45

    30 33

    45 es mayor a 30 y a 33 => Lo intercambio por el

    menor (el 30)

  • Mtodo removeMin()

    Estructuras de datos - Dr. Sergio A. Gmez 42

    cola.insert( 20 )

    cola.insert( 45 )

    cola.insert( 30 )

    cola.insert( 16 )

    cola.insert( 18 )

    cola.insert( 33 )

    cola.insert( 25 )

    e cola.removeMin() // 16

    e cola.removeMin() // 18

    e cola.removeMin() // 20

    e cola.removeMin() // 25

    30

    45 33

    45 lleg a una hoja => termin

  • Mtodo removeMin()

    Estructuras de datos - Dr. Sergio A. Gmez 43

    cola.insert( 20 )

    cola.insert( 45 )

    cola.insert( 30 )

    cola.insert( 16 )

    cola.insert( 18 )

    cola.insert( 33 )

    cola.insert( 25 )

    e cola.removeMin() // 16

    e cola.removeMin() // 18

    e cola.removeMin() // 20

    e cola.removeMin() // 25

    e cola.removeMin() // 30

    30

    45 33

    Reemplazo el 30 por el ltimo nodo del listado

    por niveles

  • Mtodo removeMin()

    Estructuras de datos - Dr. Sergio A. Gmez 44

    cola.insert( 20 )

    cola.insert( 45 )

    cola.insert( 30 )

    cola.insert( 16 )

    cola.insert( 18 )

    cola.insert( 33 )

    cola.insert( 25 )

    e cola.removeMin() // 16

    e cola.removeMin() // 18

    e cola.removeMin() // 20

    e cola.removeMin() // 25

    e cola.removeMin() // 30

    33

    45

    33 es menor a 45 => termin

  • Mtodo removeMin()

    Estructuras de datos - Dr. Sergio A. Gmez 45

    cola.insert( 20 )

    cola.insert( 45 )

    cola.insert( 30 )

    cola.insert( 16 )

    cola.insert( 18 )

    cola.insert( 33 )

    cola.insert( 25 )

    e cola.removeMin() // 16

    e cola.removeMin() // 18

    e cola.removeMin() // 20

    e cola.removeMin() // 25

    e cola.removeMin() // 30

    e cola.removeMin() // 33

    45

    Reemplazo 33 por 45 => termin.

  • Mtodo removeMin()

    Estructuras de datos - Dr. Sergio A. Gmez 46

    cola.insert( 20 )

    cola.insert( 45 )

    cola.insert( 30 )

    cola.insert( 16 )

    cola.insert( 18 )

    cola.insert( 33 )

    cola.insert( 25 )

    e cola.removeMin() // 16

    e cola.removeMin() // 18

    e cola.removeMin() // 20

    e cola.removeMin() // 25

    e cola.removeMin() // 30

    e cola.removeMin() // 33

    e cola.removeMin() // 45

    Elimino el 45 => termin porque el rbol qued

    vaco.

  • Representacin con arreglos del rbol

    binario

    Estructuras de datos - Dr. Sergio A. Gmez 47

    rbol

    0 1 2 3 4 5 6 7 8 9 10 11 12 13

    30 18 25 45 20 33

    Hijo_izquierdo(i) = 2i

    Hijo_derecho(i) = 2i+1

    Padre(i) = i div 2

    30

    18 25

    45 20 33

    Nota: La componente 0 del arreglo no se usa.

    Nota: Las components del arreglo representan el listado por niveles del rbol.

  • Implementacin en Java

    Estructuras de datos - Dr. Sergio A. Gmez 48

    public class Heap implements PriorityQueue{

    protected Entrada [] elems;

    protected Comparator comp;

    protected int size;

    private class Entrada implements Entry //Clase anidada

    {

    private K clave; private V valor;

    public Entrada(K clave, V valor) {

    this.clave = clave;

    this.valor = valor;

    }

    public K getKey() { return clave; }

    public V getValue() { return valor; }

    public String toString() {

    return "(" + clave + ", " + valor + ")"; }

    }

  • Estructuras de datos - Dr. Sergio A. Gmez 49

    public Heap(int maxElems, Comparator comp ) {

    // Lector: Mirar bien cmo se hace la creacin del arreglo!!

    elems = (Entrada []) new Entrada[maxElems];

    this.comp = comp;

    size = 0;

    }

    public int size() {

    return size;

    }

    public boolean isEmpty() {

    return size == 0;

    }

  • Estructuras de datos - Dr. Sergio A. Gmez 50

    public Entry min() throws EmptyPriorityQueueException

    {

    if (isEmpty())

    throw new EmptyPriorityQueueException();

    return elems[1];

    // Recuerde que la componente 0 del arreglo no se usa

    }

  • Resolucin de Problemas y Algoritmos - Dr.

    Sergio A. Gmez51

    public Entry insert(K key, V value) throws InvalidKeyException {

    Entrada entrada = new Entrada(key, value);

    elems[++size] = entrada;

    // Burbujeo para arriba.

    int i = size; // indice de la posicion corriente en arreglo.

    boolean seguir = true;

    while ( i>1 && seguir ) {

    Entrada elemActual = elems[i];

    Entrada elemPadre = elems[i/2];

    if( comp.compare(elemActual.getKey(), elemPadre.getKey()) < 0) {

    Entrada aux = elems[i];

    elems[i] = elems[i/2];

    elems[i/2] = aux;

    i /= 2;

    } else // Si no pude intercambiar => esta ordenada.

    seguir = false;

    }

    return entrada;

    }

    Tinsert( n ) = O(h) = O(log2(n)) si n es la cantidad de nodos del heap this y h su ltura.

  • 52

    public Entry removeMin() throws EmptyPriorityQueueException {

    Entry entrada = min(); // Salvo valor a retornar.

    if( size == 1 ) { elems[1] = null; size = 0; return entrada; }

    else {

    // Paso el ltimo a la raiz y lo borro del final

    elems[1] = elems[size]; elems[size] = null; size--;

    // Burbujeo la raiz hacia abajo.

    int i = 1; // Estoy parado en la raiz

    boolean seguir = true;

    while ( seguir ) {

    // Calculo la posicion de los hijos.

    int hi = i*2; int hd = i*2+1;

    boolean tieneHijoIzquierdo = hi

  • 53

    // Me fijo si hay que intercambiar el actual con el menor de sus hijos.

    if( comp.compare(elems[i].getKey(), elems[m].getKey()) > 0 ) {

    Entrada aux = elems[i];

    elems[i] = elems[m];

    elems[m] = aux;

    i = m; // Ahora actualizo a partir de m.

    } else seguir = false;

    }

    }

    return entrada;

    }

    TremoveMin(n) = O(h) = O(log2(n))

    Recuerde que probamos que h es del rden de logaritmo base 2 de la cantidad de

    nodos del rbol.

  • Aplicacin: Heap Sort

    Objetivo: Ordenar un arreglo A de N enteros en forma ascendente

    Estrategia: Insertar los n elementos del arreglo en un heapinicialmente vaco y luego eliminarlos de a uno y almacenarlos en el arreglo.

    Algoritmo HeapSort( a, n )

    cola new ColaConPrioridad()

    para i 0..n-1 hacer

    cola.insert( a[i] )

    para i 0..n-1 hacer

    a[i] cola.removeMin()

    Complejidad: Theapsort(n) = O(nlog2(n))

    Resolucin de Problemas y Algoritmos - Dr. Sergio A. Gmez 54

  • Heap sort in place En lugar de usar una cola con prioridades externa al

    arreglo a, se puede usar una porcin del mismo arreglo apara implementar la cola con prioridades y as no usar memoria adicional.

    a

    Paso 1: para i=0 hasta n-1 insertar a[i] en la maxheap

    Paso 2: para i=n-1 hasta 0 eliminar el mximo elemento de la maxheap y ubicarlo en a[i].

    Complejidad: Theapsortinplace(n) = O(nlog2(n))

    Estructuras de datos - Dr. Sergio A. Gmez 55

    Max heap de tamao iPorcin de tamao n-i del

    arreglo no ordenada

    i

  • Bibliografa

    Captulo 8 de M. Goodrich & R. Tamassia, Data

    Structures and Algorithms in Java. Fourth

    Edition, John Wiley & Sons, 2006.

    Estructuras de datos - Dr. Sergio A. Gmez 56