Tipos abstractos de datos. Tipos Conjunto y Diccionario.

Anuncio
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
Descargar