Clase práctica 15

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