Вы находитесь на странице: 1из 7
P1 Préctica. (2 puntos) Supongamos que se levanta Ia restriecién de que cada académico sélo pueda realizar una tesis doctoral (nétese que deberdn conservarse los supervisores para cada tesis de cada. doctor). a) {Cémo afectaria a la representacién de los datos en el segundo supuesto (academia con Arbol genealégico completo)? Comente los cambios necesarios, si los hubiere, sin escribir el eédigo. ) {Qué cambios habria que realizar en el método get Siblings para que, recibiendo la tesis como pardmetro (en caso de multiples tesis para un mismo doctor), devolviese los hermanos debidos a esa tesis para ese doctor? 1, (.5 punto) Considérense las implementaciones de los nimeros factorial(n) y fibonacci(n) mediante sus definiciones matemiticas recursivas (para naturales, es decir, la precondicién de ambas exige enteros no negativos): int fact (int n) ( aint fib(int n)( if(n == 0) return 1; 4f(n<2) return 1; else return n + fact (n-1); else return fib(n-1)4fib(n-2); Explicar de forma razonada cusl seria su coste asintético temporal en caso peor, y qué se puede concluir sobre la adecuacién de cada una de estas implementaciones. 2, (1.5 puntos) Impleméntese un programa recursivo que compruebe si un &rbol binario de enteros tiene algiin valor mayor que un ntimero dado k. Razénese cual es su coste asintético temporal y comparese con el de la implementacién directa de la funcién de Fibonacci considerada en el ejercicio anterior. 3. Se desea abordar el problema de la ordenacién de enteros cuando el conjunto de entrada tiene muchas repeticiones y una cantidad reducida de mimeros diferentes (por ejemplo, cuando en una oficina de correos se organizan los sobres por oédigo postal; hay un ntimero reducido de eédigos postales que Iegan a esa oficina, y un nimero grande de envios que corresponden a cada uno de los eédigos). Llamaremos PCollection a un conjunto de enteros con estas caracteristicas. Su interfaz. puede ser: PCollectionIF: 7* Representa una bolsa de nimeros con pocos elementos distintos * * posiblemente muy repetidos. */ public interface PCollectionIF { 7* Consulta la frecuencia con que aparece un entero num en la coleccién. 7» @param el entero num * /* @returns el mimero de veces que aparece num en la coleccidn. wf public int frequency (int num) /* Consulta el tamafio de 1a coleccién. * /* @returns el ntimero total de enteros en la coleccidn (contando los * repetidos. + public int size() /* Consulta los valores distintos que aparecen en 1a coleccién. . * @returns lista de valores diferentes que aparecen en 1a coleccién, — + ordenados de menor a mayor. / public ListIF getValues () /* Ordena los valores en la coleccién de menor a mayor. . /* @returns la lista completa de enteros de la coleccién, con . Consigne sus datos en todas las hojas que entregue. No se puntuaran respuestas sin justificar. repeticiones, ordenados de menor a mayor. */ public ListIF sort () /» Afade un nuevo mimero a 1a coleccién. +/ public void addNiumber (int num) ) Una forma eficiente de ordenar un conjunto de estas caracteristicas es haciendo analogia con el reparto de cartas en buzones. En este caso, el equivalente de echar Ia carta en su buzén consiste en disponer de un espacio reservado para cada valor posible, y en ese espacio ir contando el mimero de veces que aparece ese valor segiin se va incrementando la coleccién. Contemplaremos dos supuestos diferentes: A) Se conoce de antemano la lista de valores posibles que toman los enteros de la coleccién, Un ejemplo serian las notas obtenidas por una serie de estudiantes en una o varias asignaturas (siempre que sean enteras), ya que sabemos que los valores serén siempre enteros del 0 al 10. B) Se desconoce a priori cual es la lista de valores posibles. Se pide: 4a) (1°5 puntos) Implementar los métodos de la interfaz PCol lect ion IF en el supuesto (A) median te una clase Collect ional. Se requiere que el método size tenga un coste asintético temporal en O(1). 6) (1’5 puntos) Implementar los métodos frequency y get Values de la interfaz PCollect LonIF en el supuesto (B) mediante una clase PCol lect ionB, con la misma restriccién sobre el método size. ©) (1 punto) Razonar sobre el coste asintético temporal en caso peor del método frequency en cada uno de los supuestos, 4) (1 punto) Razonar sobre el coste asintdtico temporal en caso peor del método sort en cada uno de los supuestos. Se sabe que el problema general de ordenacién de n enteros arbitrarios puede resolverse, en el mejor de los casos, con un coste asintdtico temporal en caso peor de O(n log n). Comparar esta cota con los costes calculados y establecer conclusiones. Estrategias de Programacién y Estructuras de Datos INTERFAC be Los TAD bi curso, CollectionIF (Coleccién) /* Representa una coleccién de elementos. Una coleccién no * tiene orden. public interface CollectionIF { 7+ Devuelve el mimero de elementos de 1a coleccion. + @return: cardinalidad de 1a coleccin. public int size (); 7+ Determina si la coleccién esté vacia. * @return: size () = 0 public boolean iszmoty (); 7+ Determina 1a pertenencia del pardmetro a la coleccién » @param: el elemento cuya pertenencia se comprueba. + Greturn:param \in self Public boolean contains (E e); /+ Elimina todos los elementos de 1a coleccion. public void clear (); 7+ Devuelve un iterador sobre la coleccién. + @return: un objeto iterador para los elementos de + la coleccién. public IteratorIF iterator ()j ) Set IF (Conjunto) /* Representa un conjunto de elementos. Se trata del concepto * matemético de conjunto finito (no tiene orden). public interface SctIF extends CollectionIF { /» Devuelve 1a unién del conjunto llamante con el pardmetro * @param: el conjunto con et que realizar la union » @return: self \cup @param public SetIF union (SetIF s); 7+ Devuelve 1a interseccidn con el parémetro. » @param: el conjunto con el que realizar la interseccion. + @return: self \cap @paran public SetIF intersection (SetIF 5); 7+ Devuelve la diferencia con el pardmetro (los elementos * que estén en el llamante pero no en el pardmetro). + @param: e1 conjunto con el que realizar la diferencia. » @return: self \setminus eparan public SetIF difference (SetIF 8); 7+ Determina si el pardmetro es un subconjunto del llamante. + param: e1 posible subconjunto del llamante. ¥ @return: self \subseteq @paran Public boolean isSubset (SetIF 5); J List IF (Lista) /* Representa una lista de elementos. public interface ListiF extends CollectionIF( /+ Devuelve el elemento de 1a lista que ocupa la posicion + indicada por el pardmetro. » @param pos la posicién comenzando en 1. + @Pre: 1 \leq pos \leq size() * @return el elemento en 1a posicidn pos. public E get (int pos); /+ Modifica la posicién dada por el pardmetro pos para que a/ No es necesario entregar las hojas de interfaces Estrategias de Programacién y Estructuras de Datos INTERFACES DB LOS TAD Der. CURSO + contenga el valor dado por el pardmetro e. 3 » @param pos 1a posicidn cuyo valor se debe modificar, * * comenzando en 1. . * @param e el valor que debe adoptar 1a posicién pos. + + @Pre: 1 \leq pos \leq size() / public void set (int pos, Ee); 7+ Inserta un elemento en 1a Lista. : * param elem El elemento que hay que afadir. * + Gparam pos La posicidn en 1a que se debe afladir elem, * * comenzando en 1. + + @Pre: 1 \leq pos \leq size()+1 / public void insert (E elem, int pos); 7+ Elimina el elemento que ocupa 1a posicidn del pardmetro * » param pos 1a posicién que ocupa el elemento a eliminar, * comenzando en 1 * @Pre: I \leq pos \leq size() +/ Public void remove (int pos); ) StackIF (Pila) /* Representa una pila de elementos. +/ public interface StackIF extends CollecticnIF{ /* Obtiene el elemento en la cima de 1a pila ‘ + @re !isEmpty (); 2 » @return la cima de la pila. / public E getTop (); /» Incluye un elemento en la cima de 1a pila. Modifica el + » tamario de la misma. : + @param elem el elemento que se quiere afiadir en la cima */ public void push (B elem); /» Elimina la cima de la pila. Modifica el tamafio de la . + pila. ‘ + @Pre fiskmpty (); 1 public void pop (); } QueuelF (Cola) /* Representa una cola de elementos. vf public interface QueueIF extends CollecticnIF{ /+ Devuelve el primer elemento de 1a cola. : + @re !iskmpty() * » @return 1a cabeza de 1a cola (su primer elemento). “ public £ getFirst 0; /+ Incluye un elemento al final de la cola. Modifica el * + tamafio de la misma (crece en una unidad). ‘ » Gparam elem el elemento que debe encolar (afladir). / public void enqueue (E elem); /» Elimina el primer elemento de 1a cola. Modifica la * + tamario de 1a misma (decrece en una unidad). + * @re !iskmpty(); at public void dequeue (); ) TreeIF (Arbol general) /* Representa un drbol n-ario de elementos, donde el niimero de + No es necesario entregar las hojas de interfaces Estrategias de Programacién y Estructuras de Datos INTERFACES DB Los TAD bi curso, + hijos de un determinado nodo no esta determinado de antemano + + (fan-out no prefijado, no necesariamente igual en cada nodo). */ public interface TrecIF extends Collect ionIF( Public int PREORDER = 0; public int POSTORDER = 1; public int BREADTH = 2; /* Obtiene 1a raiz del Arbol (unico elemento sin antecesor). + + @Pre: lisEmpty (); » + @return el elemento que ocupa 1a raiz del Arbol. v public E getRoot (); /+ Modifica la raiz del drbol. * + @param el elemento que se quiere poner como raiz del * » drbol. v public void setRoot (Ee); /+ Obtiene los hijos del Arbol llamante. . + @Pre: !isEmpty (); . + @return 1a lista de hijos del 4rbol (en el orden en que = + estén almacenados en el mismo). / public ListIF > getChildren (); /» Obtiene el hijo que ocupa la posicién dada por pardmetro. + * param pos 1a posicidn del hijo que se desea obtener, * » comenzando en 1. . + @Pre 1 \leq pos \1eq getChildren().size() @& !isEmpty() * @return el Arbol hijo que ocupa 1a posicidn pos. / public TreeIF getChild (int pos); /* Inserta un drbol como hijo en 1a posicién pos. . + Gparam pos 1a posicién que ocupard el drbol entre sus * + hermanos, comenzando en 1. » » Si pos == getChildren ().size () + 1, se aflade como * + ultimo hijo. » + @param e el hijo que se desea insertar. x + @Pre 1 \leq pos \leq getChildren().size()+1 && !isEmpty() */ public void addChild (int pos, TreeIF e); /+ Elimina el hijo que ocupa la posicidn pardmetro. » » @param pos la posicién del hijo con base 1. . + @Pre 1 \leq pos \leq getChildren().size() && !isEmpty() — */ public void removeChild (int pos); /» Determina si el arbol llamante es una hoja. z + @Pre: !isEmpty (); (un arbol vacio no se considera hoja) + ¥ Greturn 1 Arbol es una hoja (no tiene hijos). / public boolean iskeaf (); 7+ Obtiene un iterador para el drbol. * + @param traversal el tipo de recorrido indicado por les * » constantes PREORDER (preorden o profundidad), POSTORDER + * (postorden) o BREADTH (anchura) * + @return un iterador segin el recorrido indicado / public IteratorIF iterator (int traversal); } BTreelF (Arbol Binario) /* Representa un arbol binario de elementos ” public interface BirecIF extends Collect ionIF( public int PREORDER = 0; public int POSTORDER - 1; public int BREADTH = 2; No es necesario entregar las hojas de interfaces Estrategias de Programacién y Estructuras de Datos INTERFAC be Los TAD bi curso, public int INORDER = 3; public int RLBREADTA = 4; /+ Obtiene 1a raiz del drbol (unico elemento sin antecesor). + @Pre: !isEmpty (); + @return el elemento que ocupa la raiz del drbol. public E getRoot (); /* Obtiene el hijo izquierdo del Arbol llamante o un 4rbol » vacio en caso de no existir. + @Pre: !isEmpty (); * @zeturn un drbol, bien el hijo izquierdo bien uno vacio + de no existir tal hijo. public BireeIF getLeftchild (); /* Obtiene el hijo derecho del drbol llamante 0 un arbol » vacio en caso de no existir. @Pre: liskmpty (); + @return un drbol, bien el nijo derecho bien uno vacio + de no existir tal hijo. public EireeIF getRightChild (); /* Modifica la raiz del Arbol. » @param el elemento que se quiere poner como raiz del + dzbol. public void setRoot (Be); 7+ Pone el drbol pardmetro como hijo izquierdo del Arbol + llamante. $i ya habia hijo izquierdo, el antiguo dejard de + ser accesible (se pierde). + @Pre: !isEmpty (); * param child el Arbol que se debe poner como hijo izquierdo. public void setLeftChild (BTreeIF child); 7+ Pone el drbol pardmetro como hijo derecho del Arbol * llamante. Si ya habia hijo izquierdo, el antiguo dejard de + ser accesible (se pierde). * @Pre: JisEmpty (); * @param child el drbol que se debe poner como hijo derecho. public void setRightChild (BTreeIF child); /* Elimina el hijo izquierdo del Arbol. * @Pre: lismpty (); public void removeleftChild (); /* Elimina el hijo derecho del Arbol. + @Pre: !isEmpty (); public void removeRightChild 0); 7* Determina si el drbol llamante es una hoja. » @Pre: !isimpty (J; (un arbol vacio no se considera hoja) » @return true sii el 4rbol es una hoja (no tiene hi jos). public boolean isLeaf (); 7+ Obtiene un iterador para el Arbol. * @param traversal el tipo de recorrido indicado por las + constantes PREORDER (preorden 0 profundidad), POSTORDER * (postorden), BREADTH (anchura), INORDER (inorden) o » RLBREADTH (anchura de derecha a izquierda). @return un iterador segun el recorrido indicado. public IteratorIF iterator (int traversal); ) ComparatorIF (Comparador) /* Representa un comparador entre elementos respecto a una No es necesario entregar las hojas de interfaces Estrategias de Programacién y Estructuras de Datos INTERFACES DB Los TAD bi curso, * relacién de (al menos) preorden. +/ public interface ComparatorIF( 7* Sean a, b elementos de un conjunto dado y \sqsubset 1a + relacién que establece un preorden entre ellos (ndtese + * que \sqsupset seria la relacién reciproca, es decir, en » sentido opuesto a \sqsubset): / public static int LT = -1; // Less than: a \sqsubset b public static int EQ - 0; // Equals: !(a \sqsubset b) && // &@ Ha \sqsupset b) public static int GI - 1; // Greater than: a \sqsupset b /+ Compara dos elementos respecto a un preorden e indica su + + relacion respecto al mismo, es decir, cudl precede al * + otro mediante esa relacidn. . * @param a el primer elemento. » * @param b el segundo elemento. : * @return LT sii a \subsesq b; . . EQ sii !(a \subsetsq b) e& !(a \sasupset b) x * Gr sii a \sqsupset b ” public int compare (E a, Eb); /* Determina si el primer pardmetro precede en el preorden » al segundo (a a). . » @param a el primer elemento. * + @param b el segundo elemento. * * @return a GT b sii b \sqsupset a / public boolean gt (E a, Eb); IteratorIF (Iterador) /* Representa un iterador sobre un Tipo Abstracto de Datos. */ public interface IteratorIF{ 7+ Obtiene el siguiente elemento de 1a iteracién. » * @Pre: hasNext (); . + @return el siguiente elemento de 1a iteracién, */ public T getNext (); 7» Comprueba si atin quedan elementos por iterar. * + @return true sii el iterador dispone de mds elementos. —*/ public boolean hasNext (); 7+ Vuelve la posicién del iterador a1 principio. Esto » + permite reutilizar un iterador evitando crear otro nuevo. +/ public void reset (); No es necesario entregar las hojas de interfaces

Вам также может понравиться