If you can't read please download the document
Upload
darktrekker
View
49
Download
0
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)
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