Algoritmos y Estructura de Datos I Facultad de Ciencias Exactas y Naturales Lunes 6 de octubre de 2014 Esquema I Conocer (por arriba) la Standard Template Library I Una implementación de [T ]. Tipo Mapa I I I Codear dos implementaciones distintas. Proponer invRep y abs para cada una. Qué es STL? I Contenedores I Algoritmos I IO I Otros A lo largo de la carrera se ve como funcionan por debajo cada uno de sus componentes. Hoy veremos como usar el tipo vector para representar nuestras listas. vector < T > problema CVector ( n : Z, e : T) = result : [T] { requiere n > 0 ; asegura |result| == n ; asegura (∀x ← result)x == e ; } problema push back (a: [T], e: T) { modifica a ; asegura |a| == |pre(a)| + 1 ; asegura (∀i ← [0.. |pre(a)|))ai == pre(a)i ; asegura a|a|−1 == e ; } problema size (a: [T]) = result : Z { asegura result == |a| ; } problema at (a: [T], i: Z) = result : T { requiere 0 ≤ i < |a| ; asegura result == ai ; } Tipo Mapa Nuestro tipo mapa representará un conjunto de ciudades y rutas entre ellas. I Las rutas son de dos manos y entre dos ciudades no hay más de una ruta que las conecta. I Ningún camino puede conectar a una ciudad consigo misma. I Las ciudades están numeradas y comienzan a partir del 0. Tipo Mapa tipo Mapa { observador cantidadCiudades (m : Mapa) : Z ; observador rutas (m: Mapa) : [hZ, Zi] ; invariante (∀r ← rutas(m))enRango(prm(r ), m) ∧ enRango(sgd(r ), m) ; invariante (∀r ← rutas(m))prm(r ) 6= sgd(r ) ; invariante distintasRutas(rutas(m)) ; } Tipo Mapa problema nuevoMapa (n : Z) = result : Mapa { requiere n ≥ 0 ; asegura cantidadCiudades(result) == n ; asegura rutas(result) == [] ; } problema agregarRuta (m : Mapa, u,v: Z) { requiere u ≥ 0 ∧ v ≥ 0 ; requiere u 6= v ; modifica m ; asegura cantidadCiudades(m) == max(cantidadCiudades(pre(m)), max(u, v ) + 1) ; asegura (∀r ← rutas(pre(m)))perteneceRuta(r , rutas(m)) ; asegura perteneceRuta((u, v ), rutas(m)) ; asegura (∀r ← rutas(m), otraRuta(r , (u, v )))perteneceRuta(r , rutas(pre(m))) ; } Tipo Mapa problema cantidadDestinos (m: Mapa, u : Z) = result : Z { requiere enRango(u, P m) ; asegura result == [1|r ← rutas(m), prm(r ) == u ∨ sgd(r ) == u] ; } problema sonVecinos (m: Mapa, u,v: Z) = result : Bool { requiere enRango(u, m) ∧ enRango(v , m) ; asegura result == perteneceRuta((u, v ), rutas(m)) ; } Formas de implementarlo Implementación 1 I Definimos una matriz de N × N de enteros. I Cada elemento i, j de la matriz tiene un 1 si i es vecino de j, 0 en caso contrario. I Ejemplo: 3 ciudades, 0 y 1 son vecinas, 1 y 2 también. 0 1 2 0 0 1 0 1 1 0 1 2 0 1 0 Implementación 2 I Definimos una secuencia de N elementos. I Cada elemento i de la secuencia es otra secuencia que tiene a todos los vecinos de i. I Mismo ejemplo: 3 ciudades, 0 y 1 son vecinas, 1 y 2 también. 0 [1] 1 [0, 2] 2 [1] Ejercicio I Implementar los dos diseños propuestos del tipo Mapa (problemas nuevoMapa, agregarRuta, cantidadDestinos y sonVecinos). I I I Matriz de adyacencias. Listas de adyacencias. Escribir el invRep y el abs para cada una. invRep y abs de implementación 1 // i n v R e p ( imp : CMapa ) : // ( ∀ i ← [ 0 . . | imp . a d j | ) ) | imp . a d j |==| imp . a d j [ i ] | && // ( ∀ i , j ← [ 0 . . | imp . a d j | ) ) ( imp . a d j [ i ] [ j ] >= 0 && imp . a d j [ i ] [ j ] <= 1 ) && // ( ∀ i ← [ 0 . . | imp . a d j | ) ) imp . a d j [ i ] [ i ] == 0 && // ( ∀ i , j ← [ 0 . . | imp . a d j | ) ) imp . a d j [ i ] [ j ] == imp . a d j [ j ] [ i ] // a b s ( imp : CMapa , e s p : Mapa ) : // c a n t i d a d C i u d a d e s ( e s p ) = = | imp . a d j | && // ( ∀ i , j ← [ 0 . . | imp . a d j | ) , imp . a d j [ i ] [ j ] ) p e r t e n e c e R u t a ( ( i , j ) , r u t a s ( e s p ) ) && // ( ∀ r ← r u t a s ( e s p ) ) ( imp . a d j [ prm ( r ) ] [ s g d ( r ) ] == 1 && imp . a d j [ s g d [ r ] [ prm ( r ) ] == 1 ) invRep y abs de implementación 2 // i n v R e p ( imp : CMapa ) : // ( ∀ i ← [ 0 . . | imp . v e c | ) , j ← [ 0 . . | imp . v e c [ i ] | ) ( imp . v e c [ i ] [ j ]>=0 && imp . v e c [ i ] [ j ]< | imp . v e c | ) && // ( ∀ i ← [ 0 . . | imp . v e c | ) i ∈ / imp . v e c [ i ] && // ( ∀ i , j ← [ 0 . . | imp . v e c | ) , j ∈ imp . v e c [ i ] ) i ∈ imp . v e c [ j ] && // ( ∀ i ← [ 0 . . | imp . v e c | ) d i s t i n t o s ( imp . v e c [ i ] ) // a b s ( imp : CMapa , e s p : Mapa ) : // c a n t i d a d C i u d a d e s ( e s p ) == | imp . v e c | && // ( ∀ i ← [ 0 . . | imp . v e c | ) , j ← [ 0 . . | imp . v e c i | ) p e r t e n e c e R u t a ( ( i , imp . v e c { i j } ) , r u t a s ( e s p ) ) && // ( ∀ r ← r u t a s ( e s p ) ) ( s g d ( r ) ∈ imp . v e c p r m ( r ) && prm ( r ) ∈ imp . v e c s g d ( r ) )