Otro ejemplo Queremos representar conjuntos de especies animales. Podemos hacerlo con listas, por ejemplo: Introducción a la Computación (Matemática) Primer Cuatrimestre de 2015 I Felinos = [león, gato, tigre, guepardo, pantera, puma] I Cánidos = [lobo, coyote, chacal, dingo, zorro] I Cetáceos = [delfı́n, ballena, orca, narval, cachalote] ¿Las listas son una buena forma de representar conjuntos? Tipos Abstractos de Datos I Orden: [lobo, coyote] = [coyote, lobo] ? I Repetidos: [delfı́n, delfı́n] ? Mejor definir un TAD Conjunto que nos evite estos problemas. 2 1 TAD Conjunto(ELEM) TAD Conjunto(ELEM) Operaciones (cont.): Operaciones: I CrearConjunto() → Conjunto(ELEM): Crea un conjunto vacı́o. I C .Agregar(x): Agrega el elemento x al conjunto C . I C .Pertenece?(x) → B: Dice si el elemento x está en C . I C .Eliminar(x): Elimina el elemento x de C . I C .Tamaño() → Z: Devuelve la cantidad de elementos de C . I C1 .Igual?(C2 ) → B: Dice si los dos conjuntos son iguales. donde C , C1 , C2 : Conjunto(ELEM), x : ELEM. I C1 .Unión(C2 ) → Conjunto(ELEM): Devuelve un nuevo conjunto con C1 ∪ C2 . I C1 .Intersección(C2 ) → Conjunto(ELEM): Devuelve un nuevo conjunto con C1 ∩ C2 . I C1 .Diferencia(C2 ) → Conjunto(ELEM): Devuelve un nuevo conjunto con C1 \C2 . I C .ListarElementos() → Lista(ELEM): Devuelve una lista de los elementos de C , en cualquier orden. I C .AgregarTodos(L): Agrega todos los elementos de L en C . donde C , C1 , C2 : Conjunto(ELEM), x : ELEM, L : Lista(ELEM). 3 4 TAD Conjunto(ELEM) - Posible implementación TAD Conjunto(ELEM) - Posible implementación Algoritmos de las operaciones del TAD Conjunto(ELEM) para la estructura de representación elegida: Estructura de representación del TAD Conjunto(ELEM): CrearConjunto() → Conjunto(ELEM): RV .ls ← CrearLista() Conjunto(ELEM) == hls : Listai C .Pertenece?(x) → B: RV ← (C .ls.Cantidad(x) > 0) MOMENTO. ¿No dijimos que las listas no son buenas para representar conjuntos? C .Agregar(x): if (¬C .Pertenece(x)) C .ls.Agregar(x) Correcto, pero acá encapsulamos las dificultades de representar conjuntos con listas, y el usuario del TAD Conjunto no se entera de las mismas. C .Eliminar(x): Invariante de representación de esta estructura: La lista ls no puede tener elementos repetidos. if (C .Pertenece(x)) C .ls.BorrarIésimo(C .ls.Indice(x)) C .Tamaño() → Z: RV ← C .ls.Longitud() 5 TAD Conjunto(ELEM) - Posible implementación 6 TAD Conjunto(ELEM) - Posible implementación C1 .Unión(C2 ) → Conjunto(ELEM): RV ← CrearConjunto() RV .AgregarTodos(C1 .ListarElementos()) RV .AgregarTodos(C2 .ListarElementos()) C .ListarElementos() → Lista(ELEM): RV ← CrearLista() i ←0 while (i < C .ls.Longitud()) { RV .Agregar(C .ls.Iésimo(i)) i ←i +1 } C1 .Igual?(C2 ) → B: if (C1 .Tamaño() = C2 .Tamaño()) { RV ← TRUE L ← C1 .ListarElementos() i ←0 while (i < L.Longitud()) { RV ← RV AND C2 .Pertenece?(L.Iésimo(i)) i ←i +1 } } else { RV ← FALSE } C .AgregarTodos(L): i ←0 while (i < L.Longitud()) { C .Agregar(L.Iésimo(i)) i ←i +1 } 7 8 TAD Conjunto(ELEM) - Otra implementación TAD Diccionario(T1 , T2 ) Estructura de representación del TAD Conjunto(ELEM): Asocia un valor de tipo T2 a una clave de tipo T1 . Conjunto(ELEM) == hls : Listai I Invariante de representación: True. (No ponemos ninguna restricción sobre la lista ls.) Ej: palabra/definición, paı́s/población, depto/inquilino. Operaciones: I CrearDicc() → Diccionario(T1 , T2 ): Crea un dicc. vacı́o. I C .Agregar(x) I D.Agregar(c, v ): Asocia el valor v a la clave c en el dicc D. I C .Pertenece?(x) → B I D.Definida?(c) → B: Dice si la clave c está definida en D. I C .Eliminar(x) I D.Buscar(c) → T2 : Devuelve el valor asociado a la clave c en el diccionario D. Precondición: D.Definida?(c) ¿Cómo cambian los algoritmos? I C .Tamaño() → Z Otro invariante: ls no tiene elementos repetidos y está ordenada (sup. ELEM tiene una relación de orden total). donde D : Diccionario(T1 , T2 ), c : T1 , v : T2 . 9 Repaso de la clase de hoy I TAD Conjunto(ELEM). I TAD Diccionario(T1 , T2 ). Próximos temas I Técnicas algorı́tmicas: I Backtracking. 8 reinas. 11 10