Estructuras de Datos y de la Información

Transcripción

Estructuras de Datos y de la Información
Universidad Rey Juan Carlos
Curso 2010/11
Ingeniería Técnica en Informática de Gestión
Estructuras de Datos y de la Información
Examen Final Junio 2011
Fecha: 24-6-2011
SEGUNDO PARCIAL
Normas:
• La duración de esta parte del examen es de 2 horas y 30 minutos.
• Todos los ejercicios se entregarán en hojas separadas (incluyendo los que se dejen en blanco)
Ejercicio 1 (Puntuación total: 3 puntos) Considérese una tabla hash con las siguientes
características:
• Capacidad máxima: MAX=11
• Tipo del rango de dispersión: SUBTYPE TipoRangoDispersión IS RANGE 0..MAX-1;
• Tipo de las claves de los elementos almacenados: TYPE TipoClave IS Natural;
• Función hash: hash: TipoClave → TipoRangoDispersión
hash(c) = c MOD MAX
• Función de recolocación:
rehash:TipoRangoDispersión×Positivo→ TipoRangoDispersión
p −1
rehash (i, p ) = (i + ( −1) p −1 ( ⎣
⎦ + 1) 2 ) mod MAX
2
a) (1 punto) Conteste breve y razonadamente a la siguiente pregunta: ¿es posible que la tabla
siguiente se encuentre en algún momento en dicha configuración? (téngase en cuenta que
sólo se muestran las claves de los elementos almacenados, y que los símbolos O=”ocupado”,
B=”borrado” y V=”vacío” describen el estado de cada una de las posiciones del rango de
dispersión)
0
1
2
3
4
5
6
7
8
9
10
O V
11
V
V V
V
V V
V
V
O
22
b) (2 puntos) La siguiente figura muestra el estado de la tabla en un momento determinado:
0
1
O B
11
2
3
4
O V V
2
5
6
7
O O V
12 6
8
9
10
V
V O
21
Representar los estados de la tabla alcanzados tras la realización de las siguientes
operaciones (en el orden que se indica): insertar 33, insertar 7, insertar 17, borrar 12, así
como la secuencia de posiciones del rango de dispersión sondeadas en cada una de ellas.
Ejercicio 3. (Puntuación total: 7 puntos) Se desea extender la implementación del TAD
TipoGrafo para poder iterar sobre el conjunto de nodos de un grafo de acuerdo al orden
establecido por el recorrido en profundidad. De igual forma que para los TADs TipoLista y
TipoTabla, la implementación de este tipo de funcionalidad se apoyará en la definición de un
tipo de datos TipoCursor. Los valores de TipoCursor representarán en este caso nodos del grafo,
exceptuando el valor especial denominado cursor_no_válido. A continuación se describen las
operaciones necesarias para crear y manipular cursores:
1
§
§
§
§
Cursor: TipoGrafo x TipoNodo → TipoCursor. Devuelve un cursor apuntando al nodo de
entrada. En caso de que dicho nodo no pertenezca al grafo, devuelve el valor
cursor_no_válido. El recorrido en profundidad del grafo a partir del nodo de entrada
determinará el orden en el que se visitarán el resto de nodos tras las llamadas a la operación
Siguiente.
Siguiente: TipoGrafo x TipoCursor → TipoCursor. Devuelve un cursor apuntando al
siguiente nodo del grafo de acuerdo con el orden establecido por el recorrido en profundidad.
En caso de que el cursor de entrada represente el último de los nodos del recorrido, la
operación devolverá el valor cursor_no_válido.
EsCursorVálido: TipoGrafo x TipoCursor → Booleano. Devuelve cierto si el cursor apunta a
un nodo del grafo; falso, si la operación recibe el valor cursor_no_válido.
Nodo: TipoGrafo x TipoCursor → TipoNodo. Devuelve el nodo del grafo apuntado por el
cursor.
La aplicación de cualquiera de estas operaciones al cursor no válido, dará lugar a una excepción
denominada Excepción_Cursor_No_Válido.
Por ejemplo, dado el grafo g representado en la siguiente figura y teniendo en cuenta que la
expresión Siguienten(g,c) representa el cursor obtenido tras la invocación de la operación
Siguiente sobre el cursor c un número de veces n, es decir:
Siguienten(g,c)=Siguiente(g,Siguiente(g,…Siguiente(g,c)…))
n veces
un recorrido en profundidad a partir del nodo ‘a’ podría obtenerse de la siguiente manera:
Nodo(g,Cursor(g,’a’))=’a’
Nodo(g,Siguiente(g,Cursor(g,’a’))=’b’
Nodo(g,Siguiente2(g,Cursor(g,’a’)))=’g’
Nodo(g,Siguiente3(g,Cursor(g,’a’)))=’c’
Nodo(g,Siguiente4(g,Cursor(g,’a’)))=’d’
Nodo(g,Siguiente5(g,Cursor(g,’a’)))=’f’
Nodo(g,Siguiente6(g,Cursor(g,’a’)))=’e’
Nodo(g,Siguiente7(g,Cursor(g,’a’)))=’h’
Siguiente8(g,Cursor(g,’a’)))=’cursor_no_valido’
a
b
c
f
h
g
d
e
La implementación en Ada 95 del tipo de datos TipoCursor y las operaciones anteriores se
deberá realizar mediante un hijo del paquete Grafos denominado Grafos.Iteradores. La
especificación del paquete Grafos así como la implementación de la operación
RecorridoProfundidad, incluidas en los apuntes de clase, se encuentran disponibles en el anexo
del examen.
a) (1 punto) Implementar la interfaz del paquete Grafos.Iteradores (.ads), omitiendo cualquier
tipo de comentario Ada95.
b) (2 puntos) Utilizar el paquete Grafos.Iteradores para reprogramar el procedimiento (adjunto
al enunciado del examen) que determina si un grafo dado es conexo o no.
c) (4 puntos) Implementar el cuerpo del paquete Grafos.Iteradores (.adb). La implementación
podrá basarse en la forma en la que está implementada la operación RecorridoProfundidad,
aunque ésta no podrá ser utilizada directamente.
2

Documentos relacionados