Tema 1 - Introduccion

Embed Size (px)

Citation preview

  • Tema 1: Introduccin

    Tema 2: rboles genricos

    Tema 3: Grafos

    Tema 4: Mapas y Diccionarios

    Tema 5: rboles de bsqueda

    Tema 6: ndices

    1

    Bloque 1

    Bloque 2

    Bloque 3

    Tema 0: Data Structures & Algorithms in Java (Temas: 1,2,3,4)

  • [email protected] [email protected]

    [email protected] [email protected]

  • Resumen

    Invariantes de las ED, operaciones soportadas,

    complejidad de las mismas, posibles

    Implementacin en Java

    Genericidad

    Collections

    JUnit

    Framework para la generacin de test

  • Objetivos

    Dado un problema, identificar la estructura de datos ms adecuada

    Uso de las estructuras de datos disponibles en el framework Collections

    Definir casos de prueba JUnit para verificar de manera sistemtica el correcto funcionamiento de nuestro cdigo

  • Cualquier estructura que permite almacenar datos

    durante la ejecucin de un programa

    Se puede hablar de:

    ED dinmicas o estticas

    Su uso de memoria puede cambiar (o no) durante la ejecucin de un

    programa

    ED lineales o no lineales

    Cada elemento tiene a lo sumo dos vecinos, uno que le precede y otro que

    le sigue. nicamente es posible un tipo de recorrido (en dos sentidos).

    Operaciones sobre las estructuras de datos, dos tipos:

    Consulta: search, minimum, maximum, sucessor, predecessor

    Modificacin: insert, delete

  • Es un modelo matemtico que permite definir un tipo de

    datos junto con las funciones que operan sobre l

    La mayora de los actuales lenguajes de programacin

    permiten implementar TADs mediante el uso de clases

    Las clases definen propiedades (representacin interna

    del TAD) y mtodos (operaciones soportadas por el

    TAD)

    Las instancias de un TAD

    son los objetos de una clase

    LinkedList

    - head: Node

    - size : int

    + size (): int

    + isempty (): bool

    + add ( index:int , value:E )

    + remove ( index:int ):E

    + get ( index:int ):E

    E

  • Coleccin de elementos homogneos dispuestos en

    orden tal que se recuperan en orden inverso a como se

    introdujeron (poltica LIFO)

    Dos posibles implementaciones:

    Mediante vectores: ArrayStack

    2 8 3 5

    0 1 2 3 4 5 6 7 8 9

    top = 4, MAX_SIZE = 10

    2 8 3 5 9

    0 1 2 3 4 5 6 7 8 9

    top = 5, MAX_SIZE = 10

    2 8 3 5 9

    0 1 2 3 4 5 6 7 8 9

    top = 4, MAX_SIZE = 10

    push (9)

    pop()

  • Coleccin de elementos homogneos dispuestos en

    orden tal que se recuperan en orden inverso a como se

    introdujeron (poltica LIFO)

    Dos posibles implementaciones:

    Mediante referencias: LinkedStack

    5 3 8

    top

    2

    5 3 8

    top

    2 9

    5 3 8

    top

    2 9

    push (9)

    pop()

    size = 4

    size = 5

    size = 4

  • Operaciones soportadas

    size () , isEmpty ()

    top()

    push (), pop ()

    Operacin Salida Stack

    push (5) - (5)

    push (3) - (3,5)

    pop() 3 (5)

    push (7) - (7,5)

    pop() 7 (5)

    top() 5 (5)

    pop() 5 ()

    pop() Error ()

    isEmpty () true ()

    Complejidad de cada operacin?

    Vara de una implementacin a otra?

  • Coleccin de elementos homogneos dispuestos en

    orden tal que se recuperan en igual orden a como se

    introdujeron (poltica FIFO)

    Dos posibles implementaciones:

    Mediante vectores: ArrayQueue

    3 7 11 2 7 3

    0 1 2 3 4 5 6

    head = 0, tail = 6, MAX_SIZE = 7

    3 7 11 2 7 3

    0 1 2 3 4 5 6

    3 7 11 2 7 3 9

    0 1 2 3 4 5 6

    dequeue ()

    enqueue (9)

    head = 1, tail = 6, MAX_SIZE = 7

    head = 1, tail = 0, MAX_SIZE = 7

  • Coleccin de elementos homogneos dispuestos en

    orden tal que se recuperan en igual orden a como se

    introdujeron (poltica FIFO)

    Dos posibles implementaciones:

    Mediante referencias: LinkedQueue

    dequeue ()

    enqueue(9)

    7 11 2

    head

    7 3 size = 5 3

    7 11 2

    head

    7 3 size = 6 3

    tail

    tail

    11 2 7

    head

    3 7 size = 6

    9

    tail

  • Operaciones soportadas

    size () , isEmpty ()

    front (), back()

    enqueue (E e), dequeue ()

    Diferentes tipos:

    Cola circular, con doble puntero a cabecera y final (dequeue),

    colas de prioridad (priorityqueue

    Operacin Salida queue

    enqueue (5) - (5)

    enqueue (3) - (3, 5)

    dequeue () 5 (3)

    enqueue (7) - (7,3)

    dequeue () 3 (7)

    front () 7 (7)

    dequeue () 7 ()

    Complejidad de cada operacin?

    Vara de una implementacin a otra?

  • Coleccin de elementos homogneos dispuestos en

    orden

    Cualquier elemento tiene un predecesor (excepto el primero) y

    un sucesor (excepto el ltimo)

    Dos posibles implementaciones:

    Mediante vectores: ArrayList

    Ventajas: acceso directo O(1), insercin y borrado por cabecera O(1)

    Inconvenientes: insercin y borrado en otro caso O(n), capacidad fija

    2 8 3 5 6 7 9 2

    0 1 2 3 4 5 6 7 8 9 head = 7 MAX_SIZE = 10

    2 8 3 5 6 7 9 2

    0 1 2 3 4 5 6 7 8 9

    head = 8 MAX_SIZE = 10

    add( 9, 7)

    2 9 8 3 5 6 7 9 2

    0 1 2 3 4 5 6 7 8 9

  • Coleccin de elementos homogneos dispuestos en

    orden

    Cualquier elemento tiene un predecesor (excepto el primero) y

    un sucesor (excepto el ltimo)

    Dos posibles implementaciones:

    Mediante referencias: DoubleLinkedList

    Ventajas: insercin y borrado (principio y final) O(1)

    Inconvenientes: acceso secuencial O(n)

    3 5 8 6

    head tail

  • Operaciones soportadas: addFirst (E e), addLast (E e), add ( E e, int index )

    removeFirst (), removeLast (), remove ( int index )

    clear ()

    isEmpty (), size ()

    getFirst (), getLast (), get ( int )

    contains (E e)

    Complejidad de cada operacin?

    Vara de una implementacin a otra?

    Operacin Salida List

    add(5) - (5) add(3) - (5,3) add(9) - (5,3,9)

    addLast (7) - (5,3,9,7) remove (3) 9 (5,3,7)

    contains (10) false (5,3,7) get (1) 5 (5,3,7)

    getLast () 7 (5,3,7) clear () - ()

  • Operaciones soportadas: addFirst (E e), addLast (E e), add ( E e, int index )

    removeFirst (), removeLast (), remove ( int index )

    clear ()

    isEmpty (), size ()

    getFirst (), getLast (), get ( int )

    contains (E e)

    Diferentes tipos de listas

    Simplemente enlazadas, doblemente enlazadas, ordenadas,

    Complejidad de cada operacin?

    Vara de una implementacin a otra?

  • Implementar en Java el TAD ListaFlotantes (FloatList)

    Definir un conjunto de clases que permitan trabajar con los dos

    tipos de implementaciones vistas:

    FloatArrayList

    FloatLinkedList

    Tipo de lista: simple

    Insercin y borrado por cabecera

    Operaciones:

    size () , isempty ()

    add () , remove ()

    get ()

    search () , contains ()

    7 1 2

    head

    7 3 3

    3 7 11 2 7 3

    0 1 2 3 4 5 6

    head = 0, tail = 6, MAX_SIZE = 7

  • 1

    1

    FloatNode

    - next : FloatNode

    - element : Float

    + setElement ( e:Float )

    + setNext ( node:FloatNode )

    + getElement (): Float

    + getNext (): FloatNode

    FloatList

    + size (): int

    + isempty (): boolean

    + add( value:Float )

    + add ( index:int , value:Float )

    + remove (): Float

    + remove ( index:int ): Float

    + get (): Float

    + get ( index:int ): Float

    + search ( value:Float ): int

    + contains ( value:Float ): boolean

    FloatLinkedList

    - head: FloatNode

    - size: int

    FloatArrayList

    ???????

  • 1

    1

    FloatNode

    - next : Node

    - element : Float

    + setElement ( value:Float )

    + setNext ( node:Node )

    + getElement (): Float

    + getNext (): Node

    FloatList

    + size (): int

    + isempty (): bool

    + add( value:Float )

    + add ( index:int , value:Float )

    + remove (): Float

    + remove ( index:int ): Float

    + get (): Float

    + get ( index:int ): Float

    + search ( value:Float ): int

    FloatLinkedList

    - head: Node

    - n: int

    FloatArrayList

    ???????

    Solucin?

    Inconveniente: capacidad fija

  • 1

    1

    FloatNode

    - next : FloatNode

    - element : Float

    + setElement ( e:Float )

    + setNext ( node:FloatNode )

    + getElement (): Float

    + getNext (): FloatNode

    FloatList

    + size (): int

    + isempty (): boolean

    + add( value:Float )

    + add ( index:int , value:Float )

    + remove (): Float

    + remove ( index:int ): Float

    + get (): Float

    + get ( index:int ): Float

    + search ( value:Float ): int

    + contains ( value:Float ): boolean

    FloatLinkedList

    - head: FloatNode

    - size: int

    FloatArrayList

    ???????

    Hemos realizado algn tipo de prueba

    que nos permita garantizar que el

    comportamiento de nuestra ED es el

    esperado?

  • Cmo compruebo el correcto funcionamiento de una

    clase en Java?

    Mediante un programa principal main ?

    Mayor interfaz de la clase, mayor ser mi programa principal

    Fallo en la ejecucin de mi programa:

    La ejecucin para en el primer fallo

    Qu mtodo fallo realmente?

    El resto funcionan como esperaba?, tambin estn fallando?

    Qu % de mi cdigo cubre mi programa principal de prueba?

    Pruebas unitarias

    Permiten validar los componentes (mdulos) de un sistema por separado

    En OO se realizan pruebas a nivel de clase

    Habitualmente, una prueba unitaria comprueba el correcto funcionamiento de un

    mtodo en un contexto determinado

    Diferentes herramientas que automatizan su ejecucin

  • Actionscript (FlexUnit)

    Ada (AUnit)

    C (CUnit)

    C# (NUnit)

    C++ (CPPUnit)

    Fortran (fUnit)

    Delphi (DUnit)

    Free Pascal (FPCUnit)

    JavaScript (JSUnit)

    Objective-C (OCUnit)

    Perl (Test::Class y Test::Unit)

    PHP (PHPUnit)

    Python (PyUnit)

    R (RUnit)

    Haskell (HUnit)

    Qt (QTestLib)

  • Framework que permite definir y ejecutar pruebas

    unitarias en Java

    Desarrollado por Erich Gamma y Kent Beck

    Se basa en el uso de aserciones (assert ) para

    caracterizar los resultados de la prueba

    El framework reside bajo los paquetes:

    junit.framework para JUnit 3.8 y anteriores

    org.junit para JUnit 4 en adelante

    Integrado en diferentes IDEs

  • Definir un conjunto de pruebas unitarias que permitan

    comprobar el correcto comportamiento de la ED FloatArrayList

  • public class FloatArrayListTest {

    @Test public void testSize () { } @Test public void testIsEmpty () { } @Test public void testAddFloat () { } @Test public void testAddIntFloat () { }

    }

  • public class FloatArrayListTest {

    @Test public void testSize () { } @Test public void testIsEmpty () { } @Test public void testAddFloat () { } @Test public void testAddIntFloat () { }

    }

  • @Test public void testAddFloat () {

    final int SIZE = 100; FloatArrayList list = new FloatArrayList (SIZE); list.add ( new Float (3.0)); list.add ( new Float (4.0)); list.add ( new Float (5.0)); assertEquals (5.0, list.get (). floatValue (), 0.0 ); list.remove (); assertEquals (4.0, list.get (). floatValue (), 0.0 ); list.remove (); assertEquals (3.0, list.get (). floatValue (), 0.0 );

    }

    Test mediante uso de aserciones

  • Test mediante uso de aserciones

    http://junit.sourceforge.net/javadoc/org/junit/Assert.html

    assertXXX (mensaje, valor_esperado , valor_obtenido )

    Assert Comprueba

    assertTrue ( msg, b) b es cierto

    assertFalse ( msg, b) b es falso

    assertEquals (msg,v1,v2) v1=v2

    assertEquals (msg,v1,v2, e) |v1 - v2|

  • @Test( expected =FullArrayException. class ) public void testFullArrayException () {

    final int SIZE = 10; FloatArrayList list = new FloatArrayList (SIZE); for ( int i = 0; i