Vous êtes sur la page 1sur 16

Universidad Carlos III de Madrid Ingeniera Informtica Examen de Estructura de Datos Febrero 2005 Parte Terica

Cada cuestin tiene al menos una respuesta correcta Para que una cuestin sea correcta se deben seleccionar todas sus respuestas correctas y solamente ellas En ningn caso se restan puntos Si se equivoca al responder alguna cuestin, tchese las letras de la columna entera y mrquense al lado la(s) nuevas respuestas elegida(s) Valor: 35%

Duracin: __ minutos Cuestin 1 Indique cules de las siguientes afirmaciones son ciertas:

a) La implementacin de un TAD puede modificarse sin afectar a los programas de aplicacin que se hayan implementado basndose en l. b) Las postcondiciones en la definicin lgica de una operacin de un TAD proporcionan informacin a quin la implemente en el nivel fsico sobre lo que debe codificarse. c) La abstraccin de datos es un mtodo para disear programas. d) El polimorfismo y la herencia de la orientacin a objetos sirven para aplicar el principio de modularidad al diseo de estructuras de datos. e) Ninguna de las anteriores. Solucin: a) b) Cuestin 2 En una implementacin esttica, no enlazada y circular de una cola de tamao mximo m, cul(es) de las siguientes parejas de sentencias son vlidas para determinar las situaciones de cola vaca y cola llena, respectivamente? a) b) c) d) e) vaca: frente = = 0 && final = = 0 vaca : frente = = final vaca : frente = = 1 vaca : frente = = final Ninguna de las anteriores. llena: llena: llena: llena: frente = = m && final = = m ( final + 1 ) % m = = frente ( final + 1 ) % m = = frente frente final = = m

Solucin: c)

Cuestin 3 Dada la lista simplemente enlazada y circular de la figura,


Lista

sobre ella se ha definido otra estructura lineal de almacenamiento (pila o cola). Indique cul(es) de las siguientes afirmaciones son ciertas: a) b) c) d) e) Si se define una pila, M es el siguiente elemento en salir Si se define una pila, R es el ltimo elemento en salir Si se define una cola, M es el siguiente elemento en salir Si se define una cola, M es el ltimo elemento en salir Ninguna de las anteriores.

Solucin: d) Cuestin 4 A continuacin se muestra la implementacin del mtodo remove(int index) de la clase java.util.Vector en el jdk 1.2:
public class Vector extends AbstractList implements List, ... { protected Object elementData[]; protected int elementCount; /* ... */ public synchronized Object remove(int index) { modCount++; /* modCount est heredado de AbstractList */ if (index >= elementCount) throw new ArrayIndexOutOfBoundsException(index); Object oldValue = elementData[index]; int numMoved = elementCount - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--elementCount] = null; // para recoger la basura return oldValue; } }

Indique cul(es) de las siguientes afirmaciones son ciertas: a) Vector es una implementacin secuencial y esttica de una estructura de datos lineal, pues emplea un array para guardar los elementos. b) Vector es una implementacin dinmica de una estructura de datos lineal, pues su tamao se adapta conforme se aaden y eliminan elementos. c) La complejidad de la operacin remove de Vector es O(1). d) Desde el punto de vista de la ocultacin de informacin, Vector es una buena implementacin del TAD Lista. e) Ninguna de las anteriores.

Solucin: b) d) Cuestin 5 Seale la complejidad del siguiente algoritmo en pseudocdigo, empleando la expresin ms sencilla posible para la notacin O( ):
INICIO p = 1 MIENTRAS (p <= n) p = 2*p FIN-MIENTRAS FIN

a) b) c) d) e)

O(n2) O(2n) O(n) O(log n) Ninguna de las anteriores.

Solucin: d) Cuestin 6 Sealar aquellas opciones vlidas segn el principio de abstraccin, que sirvan para implementar la estructura Conjunto, y que permitan proporcionar una complejidad igual o mejor que O(log n) en las operaciones de aadir, eliminar y pertenencia de un elemento a un conjunto de nmeros enteros del 1 al 16: a) b) c) d) e) un array de elementos un nmero entero una pila la interfaz java.util.Set Ninguna de las anteriores.

Solucin: a) b) Cuestin 7 En el rbol AVL de la figura, indquese qu tipo(s) de rotaciones sucedern para equilibrar el rbol tras eliminar el nodo de smbolo :


a) b) c) d) e) D-D I-I I-D D-I Ninguna de las anteriores.

Solucin: a) d) Cuestin 8 La figura representa un rbol binario de bsqueda que almacena las claves del 1 al 20. Indique cul es la clave asociada al nodo marcado con un smbolo . .


a) b) c) d) e) 8 9 12 13 Ninguna de las anteriores.

Solucin: d) Cuestin 9 Sobre el mismo rbol binario de bsqueda de la cuestin 8 y considerndolo como un rbol no AVL, tras eliminar el smbolo cul(es) de los elementos siguientes puede ocupar la nueva raz del rbol? a) b) c) d) e)


Ninguna de las anteriores.

Solucin: d) Cuestin 10 Sobre el mismo rbol de la cuestin 8 y considerndolo como un rbol AVL, indique cul(es) de las siguientes afirmaciones son ciertas: a) El rbol no est equilibrado en altura. b) Slo las hojas tienen factor de equilibrio nulo. c) Si eliminamos el smbolo sustituyndolo por uno de clave menor, el hijo izquierdo de ser nulo. d) Si eliminamos el smbolo sustituyndolo por uno de clave menor, el hijo izquierdo de ser e) Ninguna de las anteriores. Solucin: b) c) Cuestin 11 Dado un rbol B de orden n y altura h, que guarda la secuencia de claves desde 1 hasta k, se sabe que sus nodos contienen la mnima capacidad de elementos permitida. Cul es el rango de valores de las claves situadas en la pgina situada ms abajo y a la izquierda del rbol? a) b) c) d) e) de 1 a k de 1 a n/2 de 1 a 2n de 1 a n Ninguna de las anteriores.

Solucin: b)

Cuestin 12 En los ltimos aos, la Comunidad de Madrid ha visto ampliada varias veces su red de Metro. Si sta se modela con un grafo no dirigido, indicar cul(es) de las siguientes representaciones son vlidas y facilitan dichas ampliaciones: a) Matriz de adyacencias: 0 0 1 0 1 0 0 0 0 1 1 1 0 0 0 1 0 0 0 1 0 0 0 0 0 b) Matriz dispersa:
n elementos = 7 (1,3) (1,4) (5,2) (5,4) (2,3) (3,1) (5,1)

c) Lista de adyacencias con 2 tipos de datos distintos para los nodos (en la figura, grises y blancos): 1 2 3 4 5 1 2 4 3 3 1 4

d) Lista de adyacencias con el mismo tipo de datos para todos los nodos:

1 2 3 4 5

e) Ninguna de las anteriores.

Solucin: e) Cuestin 13 Indique cul(es) de las siguientes afirmaciones son ciertas, respecto a las tcnicas de simplificacin de algoritmos de insercin y bsqueda basadas en cabeceras y centinelas: a) El centinela mejora la complejidad asinttica de la bsqueda en una lista enlazada b) La cabecera mejora la complejidad asinttica de la insercin en una lista enlazada c) La cabecera y el centinela slo son aplicables a listas enlazadas d) El uso de cabecera y el centinela a la vez en una lista enlazada hace que la lista sea un TAD circular. e) Ninguna de las anteriores.

Solucin: e) Cuestin 14 Elegir las operaciones que se pueden implementar mediante un recorrido en postorden del rbol que representa a la estructura de datos correspondiente: a) Elaborar el ndice de un documento a partir del rbol de sus secciones y apartados b) Calcular el espacio total en disco que ocupa una carpeta, a partir del rbol de carpetas y ficheros que aqulla contiene c) Evaluar una expresin aritmtica representada por un rbol binario d) Calcular la altura mxima de un rbol binario e) Ninguna de las anteriores. Solucin: b) c) d) Cuestin 15 A partir del rbol AVL de la figura, indique cul(es) de las siguientes operaciones no provocan rotaciones:


a) b) c) d) e)

Eliminar el nodo con el smbolo Insertar un valor de clave menor que la del smbolo y mayor que la de Insertar un valor de clave mayor que la del smbolo y menor que la de Insertar un valor de clave mayor que la del smbolo y menor que la de Ninguna de las anteriores.

Solucin: a) d)

Universidad Carlos III de Madrid Ingeniera Informtica Examen de Estructura de Datos Febrero 2005 Parte de Ejercicios
Responder y entregar cada ejercicio en hojas separadas Numerar todas las hojas de un mismo ejercicio independientemente del resto del examen: 1de N, 2 de N, N de N Valor: 65% ( 30% )

Duracin: 2,5 horas (incluyendo cuestionario de prcticas)

Ejercicio 1

Se desea implementar una estructura de datos que permita gestionar las tareas que se ejecutan en una CPU multitarea. Dentro del conjunto de tareas se pueden diferenciar cinco niveles de prioridad, de 1 a 5, siendo el nivel ms prioritario el 1. Cuando hay tareas de nivel 1 stas sern las primeras en ejecutarse, si no hay de este nivel se ejecutarn las de nivel 2 y as sucesivamente hasta que no haya tareas. El orden de ejecucin dentro de un mismo nivel de prioridad es por orden de llegada. Se pide: (a) Seleccionar la estructura de datos ms adecuada para resolver las gestiones (5% puntos) (b) Definir en Java dicha estructura de datos y declarar los mtodos sin implementarlos (10% puntos): (c) Implementar la operacin de seleccin de tarea para ser ejecutada por la CPU (15% puntos). Cul es su complejidad computacional? ( 35% )

Ejercicio 2

A continuacin se muestra un ejemplo de rbol AVL representado en memoria esttica y con organizacin enlazada. El campo info contiene un string que funciona a la vez la clave de ordenacin, aunque es deseable separar ambos cometidos. Los campos izq y dch almacenan la posicin de los hijos izquierdo y derecho, respectivamente, mientras que el campo Fe representa el factor de equilibrio del nodo. Los nodos libres se encadenan dentro del array con una organizacin enlazada a travs del campo izquierdo. La posicin cero del array no se usa para almacenar elementos, sino como referencia al elemento nulo.

info 1 2 3 4 5 6 7 VALENCIA MADRID BARCELONA BETIS raz = 4

izq 5 0 0 6 3 0 0 libres = 1

dch 0 0 0 2 0 7 0

Fe 0 0 0 0 + 0

En el rbol del ejemplo, la raz es el nodo que ocupa la posicin 4, y las casillas libres son (en este orden) la 1, 5 y 3. Se pide: (a) Especificar el TAD Arbol Binario de Bsqueda para guardar elementos de tipo String, en forma de una interfaz Java cuyo nombre ser ArbolBinStr (5% puntos) (b) Implementar una clase en Java ArbolAVLEstatico que implemente una estructura de datos, esttica y enlazada, vlida para rboles como el descrito en el ejemplo, y que implemente la interfaz anterior. Emplear para ello cuantas clases Java sean necesarias. La capacidad del rbol estar limitada a una cierta constante MAX. (10% puntos) (c) Implementar en Java la operacin de bsqueda de una clave en el ArbolAVLEstatico anterior. La operacin debe devolver la informacin asociada al elemento, o null si no lo encuentra (10% puntos) (d) Implementar en Java el mtodo auxiliar
/** * Realiza una rotacin DD * @param pivote posicin del nodo pivote (N1) * @param padre posicin del padre del pivote */ protected void rotarDD(int pivote, int padre)

que realiza una rotacin simple D-D para la estructura de datos esttica y enlazada anterior, segn se indica en la figura siguiente (10% puntos)

Solucin Ejercicio 1 a) Las operaciones se tienen que resolver por orden de llegada, es decir, las primeras operaciones en llegar sern las primeras en ejecutarse, por esta razn podremos implementarlo a travs de una Cola. Como hay cinco niveles de prioridad dentro de las tareas usaremos la variante de las colas conocidas como Colas de prioridad. Tendremos 5 colas y cada una de ellas con un nivel de prioridad determinado. b) Suponiendo la siguiente interfaz de los Nodos de informacin de las Colas:
/* * Interfaz Nodo * */ package es.uc3m.tad;

public interface Nodo { /** * @return devuelve el elemento de informacin de un nodo */ public Object conseguirElemento(); /** * @return devuelve el elemento de informacin siguiente de un nodo. Si * no hubiera elemento siguiente devolvera null. */ public Object conseguirSiguiente();

Ahora definiremos la estructura cola de este tipo de nodos de la siguiente manera:


/* * Estructura Cola */ package es.uc3m.tad.cola; import es.uc3m.tad; public class ColaNodos { /** * Referencia al primer nodo de la cola */ private Nodo _cabeza; /** * Crea una cola vaca */ public ColaNodos();

/** Comprueba si la cola est vaca * @return verdadero si la cola est vaca, y falso en el caso contrario */ public boolean colaVacia();

/** Encola el elemento en la cola * @return verdadero si el elemento ha sido encolado, y falso en el caso * contrario */ public boolean encolarElemento(Object elemento); /** Desencola el elemento de la cola * @return elemento desencolado, null en caso de que la cola sea vaca */ public Object desencolarElemento(); /** Devuelve el primer elemento de la cola pero sin desencolarlo */ public Nodo cabecera(); }

Con la estructura Cola definida ya estamos en disposicin de definir la estructura ColasPrioridad:


/* * Estructura ColasPrioridad */ package es.uc3m.tad.colas; import es.uc3m.tad; public class ColasPrioridadNodos { /** * Referencia a los primeros 5 nodos de las colas */ private static final int NUM_COLAS = 5; private Nodo cabezas[NUM_COLAS];

/** * Crea las colas vacas */ public ColasPrioridadNodos(); /** Comprueba si la cola determinada est vaca * @return verdadero si la cola est vaca, y falso en el caso contrario */ public boolean colaVacia(int prioridad); /** Encola el elemento en la cola con el nivel de prioridad determinado * @return verdadero si el elemento ha sido encolado, y falso en el caso * contrario */ public boolean encolarElemento(Object elemento, int prioridad) ; /** Desencola el elemento de la cola con el nivel de prioridad determinado * @return elemento desencolado, null en caso de que la cola sea vaca */ public Object desencolarElemento(int prioridad); /** Devuelve el primer elemento de la cola con el nivel de prioridad * determinado pero sin desencolarlo */ public Nodo cabecera(int prioridad); }

c)

Suponiendo la interfaz de la clase ColasPrioridad le podemos aadir el siguiente mtodo para seleccionar la tarea de mayor prioridad a ejecutar por la CPU:

/** Selecciona la tarea a ejecutar por la CPU. Desencolar empezando por la * cola de mayor prioridad hasta que encuentre un elemento que no sea null. * @return tarea a ejecutar, null en caso de que todas las colas sean vacas */ public Object seleccionTarea(){ Object elemento = null; int i = 1; boolean noEncontrado = true; while ((i <= NUM_COLAS) && noEncontrado) { if (!colaVacia(i)) { elemento = desencolarElemento(i); noEncontrado = false; } else { i++; } } return elemento; }

La complejidad de esta operacin se puede desarrollar de la siguiente manera: O(f(n)) = O(NUM_COLAS * f(cuerpo)) = O(NUM_COLAS * (f(condicion) + f(consecuente))) = O(1) Pues las operaciones de colaVacia y desencolarElemento son O(1).

Solucin Ejercicio 2 a) Interfaz Arbol Binario de Strings:


/** * ArbolBinStr * * Interfaz con las operaciones del arbol binario de bsqueda dde Strings */ package es.uc3m.tad.arbol;

public interface ArbolBinStr { public String raiz(); /** * Comprueba si no hay ningn nodo en el rbol * @return verdadero si el rbol est vacio */ public boolean arbolVacio(); /** * Inserta un nuevo elemento en el rbol * @param elemento nuevo elemento a insertar * @param clave clave del elemento a insertar * @return verdadero si el elemento pudo insertarse, * y falso en cualquier otro caso */ public boolean insertar (String elemento, Comparable clave); /** * Elimina el nodo ocupado por una determinada clave * @param clave clave del nodo a eliminar */ public boolean borrar (Comparable clave); /** * Busca el nodo ocupado por una clave en el rbol * @param clave clave a buscar * @return la info cuya clave se le pasa siempre y cuando * lo encuentre, si no devuelve null */ public String buscar (Comparable clave); /** * Comprueba si una clave est en el rbol * @param clave valor de la clave cuya existencia se comprueba * @return verdadero si y slo si existe un nodo con esa clave en el rbol */ public boolean esta (Comparable clave); /** * Recorre el rbol: subrbol izquierdo, raz y subrbol derecho */ public void recorrerInOrden(); /** * Recorre el rbol: raz, subrbol izquierdo y subrbol derecho */ public void recorrePreOrden(); /** * Recorre el rbol: subrbol izquierdo, subrbol derecho */ public void recorrePostOrden(); }

y raz

b) c) y d)

package es.uc3m.tad; public class NodoAVLEstatico { public static final int NULO = 0; String info; Comparable clave; int izq; int dch; int fe; public NodoAVLEstatico() { clave = null; info = null; izq = NULO; dch = NULO; fe = 0; } public NodoAVLEstatico(String info, Comparable clave) { this.clave = clave; this.info = info; izq = NULO; dch = NULO; fe = 0; } /** * Rellena la clave y la informacin asociada al nodo * @param e elemento de datos * @param clave clave del elemento */ public void setElemento(String info, Comparable clave) { this.clave = clave; this.info = info; } /** * @return la informacin asociada al nodo */ public String getInfo() { return info; } /** * @return la clave del nodo */ public Comparable getClave() { return clave; } /** * @return */ public int getDch() { return dch; } /** * @return */ public int getFe() { return fe; } /** * @return */ public int getIzq() { return izq; }

/** * @param i */ public void setDch(int i) { dch = i; } /** * @param i */ public void setFe(int i) { fe = i; } /** * @param i */ public void setIzq(int i) { izq = i; } } package es.uc3m.tad.arbol; import es.uc3m.tad.NodoAVLEstatico; public class ArbolAVLEstatico implements ArbolBinStr { static final int MAX = 1023; NodoAVLEstatico nodos[]; int raiz; int primeroLibre; public ArbolAVLEstatico() { nodos = new NodoAVLEstatico[MAX]; raiz = NodoAVLEstatico.NULO; } private int buscarLibre() { if (primeroLibre != NodoAVLEstatico.NULO) primeroLibre = posHijoIzq(primeroLibre); else primeroLibre = NodoAVLEstatico.NULO; } private void liberar(int pos) { /* Aadir un nodo vaco en pos, rellenar su enlace izq con el antiguo valor de primeroLibre, y hacer apuntar primeroLibre a pos */ } public String raiz() { if (!arbolVacio()) return nodos[raiz].getInfo(); else return null; } private int posHijoIzq(int i) { if (nodos[i] != null) return nodos[i].getIzq(); else return NodoAVLEstatico.NULO; } private int posHijoDcho(int i) { if (nodos[i] != null) return nodos[i].getDch(); else return NodoAVLEstatico.NULO; } public boolean arbolVacio() { return (raiz == NodoAVLEstatico.NULO);

} public String buscar(Comparable clave) { int donde = raiz; if (!arbolVacio()) { while (donde != NodoAVLEstatico.NULO) { int comp = nodos[donde].getClave().compareTo(clave); if (comp == 0) return nodos[donde].getInfo(); else if (comp < 0) { donde = posHijoDcho(donde); } else { donde = posHijoIzq(donde); } } return null; } else return null; }

/** * Realiza una rotacin DD * @param pivote posicin del nodo pivote en el array * @param padre posicin del padre del pivote */ protected void rotarDD(int pivote, int padre) { int posHijoMayor = posHijoDcho(pivote); nodos[pivote].setDch(nodos[posHijoMayor].getIzq()); nodos[posHijoMayor].setIzq(pivote); if (padre != NodoAVLEstatico.NULO) { if (nodos[padre].getClave().compareTo(nodos[pivote].getClave()) < 0) nodos[padre].setDch(posHijoMayor); else nodos[padre].setIzq(posHijoMayor); } else { // el pivote era la raiz raiz = posHijoMayor; } } public boolean borrar(Comparable clave) { // TO-DO return false; } public boolean esta(Comparable clave) { // TO-DO return false; } public boolean insertar(String elemento, Comparable clave) { // TO-DO return false; } public void recorrePostOrden() { // TO-DO } public void recorrePreOrden() { // TO-DO } public void recorrerInOrden() { // TO-DO } }

Vous aimerez peut-être aussi