You are on page 1of 7

Algoritmos y Estructuras de Datos II

1er cuatrimestre de 2012

Algoritmos y Estructuras de Datos II


Prctica N Estructuras de datos a
Notas preliminares No se aceptarn soluciones que no compilen. a Las entregas son en grupos de hasta dos personas. Cuando se entregue cdigo, ste deber haber sido exportado. o e a

Ejercicio 1 Dada una funcin f : f (n) O(n2 ), calcular el orden computacional de los siguientes procedo imientos, justicando. a) for ( int i=0; i<n ; ++i ) f o r ( int j=0; j<n ; ++j ) f o r ( int k=0; k<n ; ++k ) { procedimiento misterioso de O ( 1 ) }

b)

void Permutaciones { System . out . print ( I n g r e s e un t e x t o : ) ; BufferedReader br = new BufferedReader (new InputStreamReader ( System . in ) ) int largo = br . readLine ( ) . length ( ) ; f o r ( double n = Math . pow ( 1 0 , largo ) ; n > 0 ; n ) System . out . println ( n ) ; }

c)

max = a [ 0 ] ; for ( int i = 0 ; i < a . size ( ) ; ++i ) { i f ( a [ i ] > max ) max = a [ i ] ; } System . out . println ( El maximo e s : + max ) ; max = a [ 0 ] ; for ( int i = 0 ; i < a . size ( ) ; ++i ) i f ( a [ i ] > max ) { max = a [ i ] ; f ( a . size ( ) ) ; } System . out . println ( El maximo e s : + max ) ;

d)

e)

max = a [ 0 ] ; for ( int i = 0 ; i < a . size ( ) ; ++i ) f o r ( int j = 0 ; i < a . size ( ) ; ++i ) { Pgina 1 de 7 a

Algoritmos y Estructuras de Datos II int h = ( i+j ) % a . size ( ) ; i f ( a [ h ] > max ) { max = a [ h ] ; f ( a . size ( ) ) ; } } System . out . println ( El maximo e s : + max ) ;

1er cuatrimestre de 2012

1.

Listas
Dada la clase ListaInt: c l a s s NodoInt { int elemento ; NodoInt siguiente ; } c l a s s ListaInt { NodoInt primero ; }

Ejercicio 2

a) Escribir el mtodo de instancia int largo() que devuelve el largo de la lista. e b) Escribir el mtodo de instancia boolean estaVacia() que informa si la lista est vac Esta e a a. funcin debe tener un orden de complejidad constante. o c) Escribir el mtodo de instancia int suma() que devuelve la suma de los elementos de la lista. La e suma de la lista vac vale 0. a d) Escribir el mtodo de instancia double promedio() que devuelve el promedio de los elementos e de la lista. El promedio de la lista vac vale 0 a e) Escribir el mtodo de instancia NodoInt iesimo(int i) que toma como parmetro una posicin e a o y devuelve el nodo que se encuentra en dicha posicin de la lista. Por ejemplo, iesimo(1) de o [2,5,6] devuelve el nodo que tiene el 5. Requiere: 0 <= i < largo(). f) Escribir el mtodo de instancia NodoInt buscar(int n) que toma como parmetro un entero y e a devuelve el primer nodo que almacena dicho entero. Si no lo encuentra debe devolver null. g) Escribir el mtodo de instancia NodoInt maximo() que devuelve el nodo que contiene el mximo e a valor de la lista. Si la lista est vac debe devolver null. a a h) Escribir el mtodo de instancia boolean estaOrdenada() que informa si la lista tiene a sus e elementos ordenados de menor a mayor. La lista vac siempre est ordenada. a a i) Escribir el mtodo de instancia boolean esSinDuplicados() que informa si la lista no tiene e elementos repetidos.

Pgina 2 de 7 a

Algoritmos y Estructuras de Datos II Ejercicio 3

1er cuatrimestre de 2012

Expandir la clase ListaInt con los siguientes mtodos. En todos los casos, los objetos nodos que e ya formaban parte de la lista, deben continuar formando parte de la misma luego de ejecutado el mtodo. e a) Escribir el mtodo de instancia void rotarDerecha() que modica la lista de modo que el ultimo e elemento (si es que tiene alguno) pasa a ser el primero. Por ejemplo: rotarDerecha sobre [1,2,3] modica a la lista de modo que queda [3,1,2]. Si la lista est vac o tiene un slo elemento, a a o rotarDerecha() no la modica. b) Escribir el mtodo de instancia void agregarEnPosicion(int pos, int elem) que toma una e posicin y un elemento e inserta un nuevo nodo con dicho elemento en la posicin especicada. o o Agregar en la posicin 0, es equivalente a agregar el elemento como primer elemento de la lista, o y agregar en la posicin dada por largo() es equivalente a agregarlo al nal de la lista. Por o ejemplo, agregarEnPosicion(0,15) sobre [5,10,20] resulta en [15,5,10,20]. agregarEnPosicion(2,15) sobre [5,10,20] resulta en [5,10,15,20]. agregarEnPosicion(3,15) sobre [5,10,20] resulta en [5,10,20,15]. Requiere: 0 <= i <= largo(). c) Escribir el mtodo de instancia void insertarOrdenado(int e) que agrega un nodo a la lista e conteniendo el elemento pasado como parmetro, de modo que esta sigue estando ordenada. a Requiere: la lista est ordenada. a d) Escribir el mtodo de clase e static void intercambiarColas(ListaInt l1, int pos1, ListaInt l2, int pos2) que corta la lista l1 a partir de pos1 y l2 a partir de pos2 e intercambia las colas de ambas listas a partir de dichas posiciones. Por ejemplo, intercambiarColas sobre l1=[2,4,6,8] y l2=[1,3,5,7] con pos1=2 y pos2=2 resulta en: l1=[2,4,5,7] y l2=[1,3,6,8] intercambiarColas sobre l1=[2,4,6,8] y l2=[1,3,5,7] con pos1=1 y pos2=3 resulta en: l1=[2,7] y l2 =[1,3,5,4,6,8] intercambiarColas sobre l1=[2,4,6,8] y l2=[1,3,5,7] con pos1=0 y pos2=0 resulta en: l1=[1,3,5,7] y l2=[2,4,6,8]

Ejercicio 4 Expandir la clase ListaInt con los siguientes mtodos. Reutilizar los mtodos que ya estn a e e e disposicin cuando sea posible. o a) Escribir el mtodo de instancia ListaInt buscarTodos(int n) que toma un entero y devuelve e una nueva lista que contiene las posiciones en las que aparece dicho entero en la lista ordenadas de menor a mayor. b) Escribir el mtodo de instancia void anexar(ListaInt otraLista) que agrega al nal de esta e lista todos los elementos de la lista recibida como parmetro. a

Pgina 3 de 7 a

Algoritmos y Estructuras de Datos II

1er cuatrimestre de 2012

c) Escribir el mtodo de clase static ListaInt concatenar(ListaInt l1, ListaInt l2) que toma e como parmetros dos listas y crea una nueva que tiene los elementos de la primera lista, seguidos a de los de la segunda. d) Escribir el mtodo de instancia ListaInt reversa() que devuelve una nueva lista que tiene los e mismos elementos de la lista actual, pero en orden inverso. e) Escribir un mtodo de clase que tome como parmetros dos listas que ya se encuene a tran ordenadas de menor a mayor y devuelva una nueva lista con los elementos de ambas listas ordenados de menor a mayor. El mtodo debe tener la siguiente signatura: e static ListaInt combinarListasOrdenadas(ListaInt l1, ListaInt l2). Requiere: l1.estaOrdenada() && l2.estaOrdenada().

Ejercicio 5 (Listas-uso de la estructura) Expandir la clase ListaInt con los siguientes mtodos. Reutilizar los mtodos que ya estn a e e e disposicin cuando sea posible. o a) Escribir el mtodo de instancia ListaInt dameElementosEnPosiciones(ListaInt pos) que e toma una lista ordenada de posiciones (indexadas desde 0) y devuelve los elementos de la lista que se encuentran en dichas posiciones. b) Escribir el mtodo de clase static ListaInt interseccion(ListaInt l1, ListaInt l2) que e toma dos listas sin repetidos y devuelve una nueva lista conteniendo los elementos que estn a presentes en ambas listas. c) Escribir el mtodo de clase static ListaInt resta(ListaInt l1, ListaInt l2) que toma dos e listas sin repetidos y devuelve una nueva lista conteniendo los elementos que estn presentes en a l1 pero no en l2. d) Escribir el mtodo de clase static ListaInt restaSimetrica(ListaInt l1, ListaInt l2) que e toma dos listas sin repetidos y devuelve una nueva lista conteniendo tanto los elementos que estn presentes en l1 pero no en l2 como los elementos que estn en l2 pero no en l1. a a

2.

Pilas y colas
Dada la clase PilaInt, con las operaciones: void apilar(int n) void desapilar() [Requiere: !estaVacia()] boolean estaVacia() int tope() [Requiere: !estaVacia()]

Ejercicio 6

Pgina 4 de 7 a

Algoritmos y Estructuras de Datos II

1er cuatrimestre de 2012

a) Escribir un mtodo de clase que tome como parmetros dos pilas que ya se e a encuentran ordenadas con el menor elemento en el tope y devuelva una nueva pila con los elementos de ambas pilas ordenados de menor a mayor (con el menor elemento en el tope). El mtodo debe tener la siguiente signatura: e static PilaInt combinarPilasOrdenadas(PilaInt p1, PilaInt p2). Nota: a diferencia del ejercicio 4.e, las dos pilas pasadas como parmetro se vaciarn. a a Pista: usar una pila auxiliar adems de la que almacena el resultado. a

Ejercicio 7 Escribir el mtodo de clase static boolean estanBalanceados(String signos) que toma coe mo parmetro una cadena de caracteres que se garantiza que slo contiene parntesis, corchetes a o e o llaves que abren o que cierran (o sea, cualquiera de los caracteres ()[]{}. La funcin devuelve o true si los parntesis, corchetes o llaves que se abren, se van cerrando y en el orden correcto. Por e ejemplo, "(()())" ")(" "([]{[]})" "[()}" "())" "[(])" Dato: resolverlo utilizando una pila auxiliar. Ejercicio 8 Usualmente, estamos acostumbrados a la notacin inja para escribir operaciones matemticas, o a en donde los operadores se escriben entre sus dos operandos. Adems de esta notacin, existe la a o notacin polaca inversa, en la cual los operadores se escriben despus de haber escrito los operano e dos del mismo, por ejemplo, para escribir (3 + 4) * 2 escribir amos 3 4 + 2 *. Algo muy prctico de esta notacin es que nos libera del uso de los parntesis. a o e a) Probar reescribir expresiones en notacin inja a notacin polaca inversa para aseguo o rarte de comprender la notacin. o b) Escribir el mtodo de clase static int evaluar(String expresion) que dada una e expresin en notacin polaca inversa, devuelve el resultado de evaluarla. La expresin o o o est formada de enteros u operaciones, separados por espacios, donde las operaciones a son alguna de *+/-. En el caso de la divisin, se asume divisin entera. Utilizar la o o clase StringTokenizer para dividir el String y el mtodo Integer.parseInt(String) e para convertir un String en un entero. s estn balanceados. a no estn balanceados. a s estn balanceados. a no estn balanceados. a no estn balanceados. a no estn balanceados. a

3.

Colas
Dada la clase ColaInt, con las operaciones: void encolar(int n) Pgina 5 de 7 a

Algoritmos y Estructuras de Datos II void desencolar() [Requiere: !estaVacia()] boolean estaVacia() int frente() [Requiere: !estaVacia()] Ejercicio 9

1er cuatrimestre de 2012

Escribir un mtodo de clase que tome como parmetros dos colas que ya se encuene a tran ordenadas de menor a mayor y devuelva una nueva cola con los elementos de ambas colas ordenados de menor a mayor. El mtodo debe tener la siguiente signatura: e static ColaInt combinarColasOrdenadas(ColaInt c1, ColaInt c2). Nota: a diferencia del ejercicio 4.e, las dos colas pasadas como parmetro van a quedar vac a as.

Ejercicio 10 Escribir un mtodo de clase que tome como parmetros dos colas y encole en ellas los elementos e a de la cola actual de manera alternada, dejando vac a la misma. El mtodo debe tener la siguiente a e signatura: void separarEn(ColaInt c1, ColaInt c2). Por ejemplo, al ejecutar c.separarEn(c1,c2) con c1 y c2 vac as: si c es [1,2,3,4,5,6] encola [1,3,5] en c1 y [2,4,6] en c2. si c es [10,2,5] encola [10,5] en c1 y [2] en c2. si c es [] encola [] en c1 y [] en c2. Nota: los elementos deben encolarse en c1 y en c2, con lo cual no es necesario que stas estn e e vac as.

4.

Conjuntos y diccionarios

Ejercicio 11 Estamos planeando una esta, y necesitamos un programa para organizar la lista de invitados. El programa debe pedir al usuario los nombres de los invitados y guardarlos en un Set de strings. Si el usuario ingresa dos veces a la misma persona, se debe contar slo una vez. Asumimos que no o hay dos invitados con el mismo nombre. a) Escribir un programa que pida el nombre de cada invitado y lo vaya agregando al conjunto, informando en todo momento la cantidad total de invitados. El programa debe terminar cuando el usuario ingresa Listo como nombre de invitado. b) Agregar al programa un men, con las siguientes opciones: u a) Agregar un invitado b) Eliminar un invitado c) Consultar la lista de invitados d ) Salir del programa

Pgina 6 de 7 a

Algoritmos y Estructuras de Datos II Ejercicio 12

1er cuatrimestre de 2012

La criba de Eratstenes es un algoritmo para encontrar todos los nmeros primos entre 2 y n. o u Se comienza con el conjunto A = {2, . . . , n} compuesto por todos los nmeros naturales entre 2 y u n. Se eliminan de A todos los mltiplos de 2 mayores que 2, luego se eliminan todos los mltiplos u u de 3 mayores que 3, y se contina as hasta eliminar de A todos los mltiplos de u u n mayores que n . Una vez completados estos pasos, slo quedan en A los nmeros primos contenidos en o u el conjunto inicial. El objetivo de este ejercicio es implementar un programa que le pida al usuario el entero positivo n y encuentre todos los nmeros primos entre 2 y n por medio de este algoritmo. u a) b) c) d) Implementar un programa que represente el conjunto A con un HashSet. Implementar un programa que represente el conjunto A con un TreeSet. Implementar un programa que represente el conjunto A con un arreglo de enteros. Comparar los tiempos de ejecucin de los tres programas para algn valor sucientemente grande o u de n.

Ejercicio 13 Implementar una clase AgendaTelefonica que permita guardar los nmeros de telfono de un u e grupo de contactos. La clase debe tener los siguientes mtodos: e void registrarTelefono(String nombre, String telefono) String consultarTelefono(String nombre) boolean contiene(String nombre) Utilizar una variable de instancia de tipo HashMap<String, String> para registrar los datos. El mtodo registrarTelefono recibe dos strings con el nombre y el telfono del contacto, y los e e guarda en el diccionario. El mtodo consultarTelefono recibe un string con el nombre y retorna e un string con el telfono. Si la persona no est en la agenda, debe lanzar una excepcin. El mtodo e a o e contiene informa si la persona pasada como parmetro est o no en la agenda. a a Ejercicio 14 Repetir el inciso d del ejercicio 5 suponiendo que todos los elementos de las listas son menores a 6n, donde n = mx{l1.lenght(), l2.lenght()}. Pods hacerlo en tiempo lineal, es decir, en O(n)? a e Ejercicio 15 Repetir la implementacin de una lista de enteros utilizando la signatura de Interface List. o Ejercicio 16 Nuevamente utilizar la Interface List, implementando la lista con un rbol binario de bsqueda. a u Ejercicio 17 Repetir el ejercicio 11 implementndolo con un Trie. Por cada invitado, incluir un telfono que a e solo se usar al imprimir la lista de invitados. a Ejercicio 18 Disear un algoritmo divide & conquer que, dado un rbol con un peso en cada nodo, calcule n a el peso total (la suma de los pesos). Cul es el costo del algoritmo si el rbol es completo? a a

Pgina 7 de 7 a