Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Guas de Ejercicios
Profesor: Diego Arroyuelo
Universidad Tecnica Federico Santa Mara
Campus Santiago San Joaqun
2015-1
Conceptos B
asicos de C
1. Dadas las siguientes declaraciones:
int i, j, k;
float f, g;
char c;
Evaluar las siguientes expresiones en orden, mostrando paso a paso el valor que toma cada
una de las variables:
i
j
k
i
f
g
c
i
j
=
=
=
=
=
=
=
=
=
1;
i++;
++i;
(j == 1) ? --k : k++;
2/4;
2.0/4;
b - 1;
(c >= a) && (c <= z) ? 1 : 0;
(i < j && (f = k-1) != 1);
(f) (24 + 2 * 6) / 4.
(g) 3 + 4 *(8 * (4 - (9 + 3)/6)).
(h) 4 * 3 * 5 + 8 * 4 * 2 - 5.
(i) 4 - 40 / 15.
(j) 6 % 2 * 15.
4. Escribir las siguientes expresiones aritmeticas usando lenguaje C. Use las reglas de asociatividad y precedencia definidas en el lenguaje para emplear la mnima cantidad de parentesis
posible en cada expresion. Tenga en cuenta que una expresion del tipo (x+y)2 puede escribirse
como pow(x+y,2).
(a)
(b)
x
y + 1.
x+y
xy .
(c)
x+ yz
x yz
(d)
b
c+d .
(e) (a + b) dc .
(f)
xy
14x .
5. Escribir un programa que lea dos enteros en las variables x e y, y a continuacion obtenga los
valores de : x/y y x%y. Ejecute el programa varias veces con diferentes pares de enteros como
entrada.
6. Cuales son los resultados visualizados en la salida estandar por el siguiente programa, si los
datos proporcionados son 5 y 8?
#include <stdio.h>
const int M = 6;
int main ()
{
int a, b, c;
puts("Introduzca el valor de a y de b:");
scanf ("%d %d", &a, &b) ;
c = 2 * a - b;
c -= M;
b = a + c - M;
a = b * M;
printf ("\n a = %d\n",a);
b = -1;
printf (" %6d %6d",b,c);
return 0;
}
7. Escriba un programa para calcular la longitud de la circunferencia y el area del crculo para
un radio introducido por el teclado.
3
ce bf
ae bd
y=
af cd
.
ae bd
Dise
nar un programa que lea dos conjuntos de coeficientes (a, b y c ; d, e y f ) y visualice los
valores de x e y.
9. Escribir un programa para convertir una medida dada en pies a sus equivalentes en: a) yardas;
b) pulgadas; c) centmetros, y d) metros (1 pie = 12 pulgadas, 1 yarda = 3 pies, 1 pulgada
= 2,54 cm, 1 m = 100 cm). Leer el n
umero de pies e imprimir el n
umero de yardas, pies,
pulgadas, centmetros y metros.
10. Teniendo como datos de entrada el radio y la altura de un cilindro queremos calcular: el area
lateral y el volumen del cilindro.
11. Escribir un programa que lea el radio de un crculo y a continuacion visualice: area del crculo,
diametro del crculo y longitud de la circunferencia del crculo.
12. Hacer un programa que acepte como entrada tres caracteres, que deben ser algunos de los
dgitos del 0 al 9, y los convierta en el correspondiente n
umero entero de tres dgitos y lo
imprima. Por ejemplo: Entrada: 4, 9, 7 Salida: 497.
13. Indique la salida producida por el siguiente programa.
#include <stdio.h>
void main()
{
int m = 45, n = 75;
printf("m = \%d, n = %d\n",m,n);
printf("m = %d, n = %d\n",++m,n--);
printf("m = %d, n = %d\n",m++,++n);
return 0;
}
14. Indique la salida producida por el siguiente programa.
#include <stdio.h>
void main()
{
int m = 99, n;
n = ++m;
4
printf("m
n = m++;
printf("m
printf("m
printf("m
return 0;
= %d, n = %d\n",m,n);
= %d, n = %d\n",m,n);
= %d \n",m++);
= %d \n",++m);
if (x >= 0)
x++;
if (x >= 1)
x += 2;
6. Escribir un programa que lea tres enteros y emita un mensaje que indique si fueron o no
ingresados en orden numerico.
7. Hacer un programa que acepte como entrada tres caracteres, que deben ser algunos de los
dgitos del 0 al 9, y opcionalmente un caracter que represente un signo (+ o -) y los convierta
en el correspondiente n
umero de tres dgitos y lo imprima. Por ejemplo:
Entrada:-, 4, 9, 7 Salida: 497
Entrada: +, 4, 9, 7 Salida: 497
8. Escribir un programa que permita introducir el n
umero de un mes (1 a 12) y visualice el
n
umero de das que tiene ese mes.
9. Escribir un programa que lea la hora de un da en notacion de 24 horas y escriba esa hora
notacion de 12 horas. Por ejemplo, si la entrada es 13:45, la salida sera 1:45 PM. El programa
pedira al usuario que introduzca exactamente cinco caracteres. As, por ejemplo, las nueve
en punto se introduce como 09:00.
10. Se quiere calcular la edad de un individuo. Para ello se va a tener como entrada dos fechas
en el formato da (1 a 31), mes (1 a 12) y a
no (entero de cuatro dgitos), correspondientes a
la fecha de nacimiento y la fecha actual, respectivamente. Escribir un programa que calcule
y visualice la edad del individuo. Si la persona tiene menos de un a
no de edad, la edad se
debe dar en meses y das; en caso contrario, la edad se calculara en a
nos.
11. Escribir un programa que detemine si un a
no es bisiesto. Un a
no es bisiesto si es m
ultiplo de
4 (por ejemplo, 1984). Sin embargo, los a
nos m
ultiplos de 100 solo son bisiestos cuando a la
vez son m
ultiplos de 400 (por ejemplo, 1800 no es bisiesto, mientras que 2000 s lo es).
12. Escribir un programa que calcule el n
umero de das de un mes, dados los valores numericos
del mes y el a
no. Tener en cuenta el caso especial de febrero en los a
nos bisiestos.
13. Determinar el menor n
umero de billetes y monedas de curso legal equivalentes a cierta cantidad de dinero en pesos chilenos.
14. Escribir y ejecutar un programa que simule una calculadora simple. Lee dos enteros y un
caracter. Si el caracter es +, se imprime la suma; si es -, se imprime la diferencia; si es *,
se imprime el producto; si es /, se imprime el cociente; y si es % se imprime el resto. Nota:
utilizar la sentencia switch.
Sentencias de Repetici
on: for, while, do-while
1. Que puede siempre afirmarse que es verdad una vez terminada una sentencia de iteracion
cuya condicion es:
(i <= T || a)
suponiendo que i es de tipo char y a es un entero.
(a) La condicion es verdadera.
(b) i <= T && a
6
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
9. En una empresa, los salarios de los empleados se van a aumentar de acuerdo a la siguiente
tabla:
Contrato
09.000 dolares
9.00115.000 dolares
15.001-20.000 dolares
mas de 20.000 dolares
% de aumento
20%
10%
5%
0%
Escribir un programa que solicite el salario actual del empleado y calcule y visualice el nuevo
salario. El programa debe permitir ingresar los salarios de varios empleados.
10. Escribir un programa que permita simular una calculadora simple (tal como se hizo en ejercicios anteriores), pero que ahora permita realizar varias operaciones simultaneas.
11. Un metodo sencillo para aproximar la constante (3.141592 . . .) es
=4
2 4 4 6 6 8 8
2n
2n
3 3 5 5 7 7 9
2n 1 2n + 1
Escriba un programa que permita calcular para un valor de n ingresado por el usuario.
12. Escribir un programa que determine todos los a
nos que seran bisiestos en el siglo XXI.
13. El valor de ex se puede aproximar con la serie
ex = 1 + x +
x2 x3
xn
+
+ +
+
2!
3!
n!
1 1
1
+ + + ,
2 3
n
en donde n es el menor n
umero natural tal que
por teclado, tal que > 0.
1
n
R ingresada
16. Entontrar el n
umero natural n mas peque
no tal que la suma de los n primeros n
umeros
naturales exceda de una cantidad introducida por el teclado.
17. Escribir un programa que calcule y visualice el mas grande, el mas peque
no y la media de n
n
umeros. El valor de n se solicitara al principio del programa y los n
umeros seran introducidos
por el usuario. Solo puede emplear variables simples en su solucion (es decir, no se pueden
usar arreglos).
18. Calcular todos los n
umeros de tres cifras tales que la suma de los cubos de las cifras es igual
al valor del n
umero.
19. Un caracter es un espacio en blanco si es un blanco ( ), una tabulacion (\t), un caracter
de nueva lnea (\n), o un avance de pagina (\f). Escribir un programa que permita
ingresar caracteres desde el teclado (puede ser una cantidad fija de caracteres o usando un
caracter de finalizacion para terminar con el ingreso de datos). El programa debe contar la
cantidad de espacios en blancos ingresados.
20. Escribir un programa que imprima en orden inverso los dgitos de un n
umero entero positivo
dado.
Funciones
1. Para el siguiente programa:
#include <stdio.h>
int cube(int y);
int main(void) {
int x;
for (x = 1; x < = 10; x++)
printf(%d\n, cube(x));
return 0;
}
int cube(int y) {
return y * y * y;
}
establecer el ambito de cada uno de los siguientes identificadores:
10
/* define la semilla */
i = rand();
Punteros
1. Para cada uno de los siguientes puntos, escribir una sentencia usando lenguaje C que lleve
a cabo la tarea indicada. Asumir que las variables numero1 y numero2 de tipo float se
encuentran definidas y que numero1 ha sido inicializada con el valor 7.3.
(a) Definir la variable fPtr como un puntero a un valor de tipo float.
(b) Asignar la direccion de la variable numero1 a la variable fPtr.
(c) Imprimir el valor del dato apuntado por fPtr.
(d) Asignar el valor del dato apuntado por fPtr a la variable numero2.
(e) Imprimir el valor de numero2.
(f) Imprimir la direccion de la variable numero1. Para eso usar el especificador de conversi
on
%p.
(g) Imprimir la direccion almacenada en fPtr. Usar el especificador de conversion %p. El
valor impreso sera el valor de la direccion de numero1?
2. Dadas las siguientes declaraciones:
int i;
int *p, *q;
12
13
Arreglos
1. Indicar si son verdaderas o falsas las siguientes afirmaciones:
(a) El tipo base de los arreglos en C es heterogeneo, es decir, se pueden almacenar valores
de distintos tipos en un mismo arreglo.
(b) El ndice de un arreglo en C puede ser de tipo double.
(c) Si hay un n
umero menor de inicializadores en una lista de inicializadores que el n
umero
de elementos en el arreglo, C automaticamente inicializa los restantes elementos con el
u
ltimo valor de la lista de inicializadores.
(d) Es un error si una lista de inicializadores contiene mas inicializadores que elementos tiene
el arreglo.
(e) Un elemento de arreglo que es pasado a una funcion f como parametro de la forma
f(a[i]) y es modificado en la funcion f se modificara tambien en la funcion que hace
la invocacion a f.
(f) En C, cuando en una funcion uno de sus parametros es un arreglo unidimensional, en la
definicion de la funcion se debe colocar su tipo base, nombre y tama
no del arreglo.
(g) En C, cuando en una funcion uno de sus parametros es un arreglo multidimensional, en
la definicion de la funcion se debe colocar su tipo base, nombre y tama
no de todas las
dimensiones del arreglo, excepto la primera.
2. Realizar las siguientes acciones, siempre que sea posible hacerlo. En caso que no sea posible,
indicar por que.
(a) Definir un arreglo de diez elementos de tipo float llamado numeros e inicializar los
elementos con los valores 0.0, 1.1, 2.2, . . ., 9.9. Asumir que la constante simb
olica
SIZE ha sido definida como 10.
(b) Definir un puntero, nPtr, que sea capaz de apuntar a una variable de tipo float.
(c) Imprimir los elementos del arreglo numeros usando un ndice entero i (que debe ser
definido) para recorrer el arreglo. Usar una sentencia for para el recorrido.
(d) Dar dos sentencias alternativas para asignar la direccion base del arreglo numeros en el
puntero nPtr.
(e) Imprimir los elementos del arreglo numeros usando el puntero nPtr para recorrer el
arreglo.
(f) Imprimir los elementos del arreglo numeros usando el nombre del arreglo como puntero
para recorrerlo.
(g) Imprimir los elementos del arreglo numeros usando un ndice entero i (que debe ser
definido) para recorrer el arreglo, y el puntero nPtr como la base del arreglo.
(h) Referenciar al elemento 4 del arreglo numeros usando:
Un ndice entero.
Usando el nombre del arreglo como puntero.
Usando un ndice entero, con el puntero nPtr como base.
Usando el puntero nPtr.
14
16
Structs
1. Indicar si son verdaderas o falsas las siguientes a firmaciones.
(a) Un struct es una coleccion de datos relacionados logicamente, bajo un mismo nombre.
(b) Los struct solo pueden contener campos que sean todos de un mismo tipo.
(c) Los struct solo pueden contener campos que sean todos de distintos tipos.
(d) Dos struct no pueden compararse usando los operadores == y !=.
(e) Una variable de tipo struct no se puede asignar a otra variable del mismo tipo.
(f) En una declaracion de una variable el nombre del struct es opcional.
(g) Los campos o miembros de distintos struct deben tener nombres u
nicos entre s.
(h) La palabra clave typedef es usada para definir nuevos tipos de datos.
(i) Los struct en C son siempre pasados por referencia a las funciones.
2. Escriba codigo C para:
(a) Definir un struct llamado parte, que sirve para guardar datos de piezas (partes) que
contenga un campo entero numero para el n
umero de parte y un campo string nombre
para el nombre de parte, cuya longitud puede ser a lo sumo de 25 caracteres (incluido
el caracter nulo).
(b) Definir Parte como un sinonimo para el tipo struct parte.
(c) Use Parte para declarar una variable a de tipo struct parte y un arreglo b[10] de
tipo base struct parte.
(d) Lea un n
umero y un nombre de parte desde el teclado y los almacene en los campos de
la variable a.
(e) Asigne los valores de los campos de la variable a al elemento 3 del arreglo b.
(f) Imprima los campos del elemento 3 del arreglo b.
3. Dadas las siguientes definiciones y declaraciones en C:
typedef struct fecha {
int dia, mes, anio;
} Fecha;
struct emp {
char nombre[30];
unsigned int nroLegajo;
unsigned short int edad;
char estadoCivil;
Fecha fechaIngreso;
} empleado;
struct espo {
17
char nombre[30];
Fecha fechaNac;
unsigned short int edad;
} esposa;
Cuales de los siguientes grupos de sentencias son validas (desde el punto de vista del lenguaje
C)?
(a) empleado.nombre[10] = esposa.nombre[10]; empleado.edad = esposa.edad;
(b) emp.nombre[10] = espo.nombre[10]; emp.fechaIngreso = espo.fechaNac;
(c) empleado.fechaIngreso = {1, 1, 2010};
(d) edad = 26; fechaIngreso.dia = 1; estadoCivil = c; nombre ="Pedro Rodriguez";
(e) Fecha.dia = 10; Fecha.mes = 8; Fecha.anio = 1910;
(f) struct espo esposo = {"Juan", {10,4,1978}, 35};
esposa = {"Maria", {1,1,1980}, 33};
4. Dados los siguientes datos, declarar los struct que los representen:
(a) Datos para calcular la medida de superficie de: un rectangulo, un triangulo y un trapecio.
(b) Un par de coordenadas cartesianas (x, y) donde x e y son dos n
umeros reales.
(c) Una direccion: calle y n
umero, localidad, codigo postal, n
umero de telefono.
(d) Un alumno: nombre (30 caracteres); n
umero de Rol; Cedula de Identidad; direccion;
Cursos (para cada curso: nombre, codigo, a
no de aprobacion).
(e) Un empleado: nombre (30 caracteres); Cedula de Identidad; direccion; fecha de nacimiento;
estado civil; cantidad de hijos; sexo.
(f) Un hotel: nombre; habitaciones, donde cada una tiene: una categora (com
un, especial,
suite, suite especial) y un tipo (individual, dos camas, doble, cuadruple). Ademas, para
un hotel se quiere mantener la cantidad de habitaciones de cada tipo as como la cantidad
de habitaciones de cada categora.
5. Escribir una funcion que calcule la distancia entre dos puntos dados en el plano, usando
el teorema de Pitagoras. Probar la funcion en un programa que solicite las coordenadas y
muestre la distancia entre los puntos.
6. Hacer una funcion que ingrese los datos de un hotel y otra que los muestre por pantalla.
Probar el uso combinado de las dos funciones en un programa.
7. Dise
nar un struct para mantener el registro de salud de una persona. Los campos del registro
deberan incluir el primer nombre de la persona, sus apellidos, la Cedula de Identidad, el
genero, la fecha de nacimiento (consistiendo de da, mes y a
no), el peso (en Kg) y la altura
(en metros). El programa debera contar con una funcion que pida los datos y los almacene en
cada uno de los campos del registro de salud. Ademas, debera incluir funciones que calculen
y retornen la edad en a
nos y el ndice de masa corporal (IMC). El programa debera solicitar
la informacion de la persona, crear el registro para la persona y mostrar la informacion almacenada en dicho registro, incluyendo el nombre y apellido, el genero, la fecha de nacimiento,
18
++p->len
(++p)->len
(p++)->len
*p->str
*p->str++
(*p->str)++
*p++->str
2. Escribir la funcion datosHoteles(int n), la cual permita ingresar los datos de n hoteles
(como los definidos anteriormente en esta gua). Los datos de los hoteles deben ser devueltos
por la funcion en un arreglo pedido dinamicamente.
3. Hacer un programa que permita ingresar una cantidad variable de cadenas de caracteres
(strings) en un arreglo, y luego las imprima. Cada cadena puede tener, a su vez, un n
umero
variable de caracteres, con una longitud maxima de 1024 chars. El programa debera definir
y usar (o reusar) una funcin para ingresar los datos y otra para imprimir el arreglo, y para
cada string debera usarse el espacio de memoria exacto que permita almacenarla (es decir,
no se admite desperdicio de memoria).
Manejo de Archivos
Escriba un programa que lea un archivo de texto (cuyo nombre es especificado como argumento en la lnea de comando), y calcule el promedio de las longitudes de todas las lneas
de mas de 20 caracteres. Si el nombre del archivo a utilizar no es especificado en la lnea de
comando, el programa debera solicitarselo al usuario.
Escriba la funcion agruparLineas(nbreArchivo, l1, l2), tal que reciba como parametros
el nombre de un archivo, y dos valores enteros l1 < l2. La funcion debe agrupar las lneas
comprendidas entre los valores l1 y l2 en una u
nica lnea. Dicho cambio debe ser reflejado
en el archivo.
Escriba la funcion saveHoteles, la que permita almacenar el contenido de un arreglo de
hoteles en un archivo. Asuma la definicion de hoteles vista anteriormente en esta gua. La
funcion recibe como parametro el arreglo de hoteles y el nombre del archivo en donde deben
almacenarse. Si dicho archivo no existe, debera crearse.
Escriba la funcion loadHoteles, la que permita leer desde un archivo una cantidad especificada de hoteles, los que son almacenados en un arreglo. Asuma la definicion de hoteles vista
20
anteriormente en esta gua. La funcion recibe como parametro el arreglo de hoteles en donde
se almacenaran los datos ledos, la cantidad de hoteles a leer desde el archivo, y el nombre
del archivo desde donde deben leerse los datos. Si dicho archivo no existe, la funcion debera
retornar un valor negativo (por ejemplo, 1). En otro caso, debera retornar la cantidad de
hoteles que fue capaz de leer.
Suponga que un arreglo de hoteles ha sido almacenado en disco. Escriba la funcion
hotel readHotel(FILE fP, int i),
tal que retorne (como un puntero) el i-esimo hotel almacenado en el archivo fP. Si dicho
hotel no existe, debe retornar NULL.
Suponga que un arreglo de hoteles ha sido almacenado en disco. Escriba la funcion
int writeHotel(FILE fP, hotel H, int i),
tal que modifique el i-esimo hotel almacenado en el archivo fP por el hotel H. Si el i-esimo
hotel no existe, debe retornar -1.
Se desea escribir una carta de felicitacion navide
na a los empleados de una empresa. El texto
de la carta se encuentra en el archivo CARTA.TXT. El nombre y direccion de los empleados
se encuentra en el archivo binario EMPLEADOS.DAT, como una secuencia de registros con los
campos nombre, direccion, etc. Escribir un programa que genere un archivo de texto por
cada empleado. La primera lnea contiene el nombre, la segunda esta en blanco, la tercera la
direccion, la cuarta esta en blanco, y en la quinta empieza el texto del archivo CARTA.TXT.
Asociatividad
izquierda a derecha
derecha a izquierda
izquierda a derecha
izquierda a derecha
izquierda a derecha
izquierda a derecha
izquierda a derecha
izquierda a derecha
izquierda a derecha
izquierda a derecha
izquierda a derecha
izquierda a derecha
derecha a izquierda
derecha a izquierda
izquierda a derecha
La columna Asociatividad indica la manera en que operadores de una misma precedencia son
asociados cuando aparecen en una expresion. As, por ejemplo, la expresion a = b = c es equivalente a (a = (b = c)), ya que la asociatividad del operador = es de derecha a izquierda. Por otro
lado, la expresion a * b / c es equivalente a ((a * b) / c), ya que la asociatividad de * y / es
de izquierda a derecha.
22
23
Gua de Ejercicios 2: An
alisis de Algoritmos
Ejercicios Obligatorios
Los siguientes ejercicios son del tipo de los que pueden aparecer en el Certamen. Tal como se dijo
en las reglas del juego del curso, uno o mas de estos ejercicios podran aparecer en el Certamen.
1. El siguiente ejercicio tiene como finalidad hacer comprender las magnitudes con las que nos
manejamos en computacion, y a ser capaces de hacer estimaciones rapidamente.
(a) Cuantos pasos se necesitan para ir caminando desde Santiago a Iquique, sabiendo que
son 1.840 Km? Si su respuesta es p pasos, Cuantos MB de memoria ocupara un arreglo
de p enteros?
(b) Cuantos pasos se necesitan para ir caminando desde Santiago a Ciudad de Mexico,
sabiendo que son aproximadamente 7.000 Km? Si su respuesta es p pasos, Cuantos MB
de memoria ocupara un arreglo de p enteros?
(c) Cuantas instrucciones es capaz de ejecutar por segundo su computador personal? Cuantos segundos tardara en inicializar en 0 los elementos de los arreglos de las partes a) y
b)?
(d) Cual es el tiempo promedio de acceso a un disco duro actual?
(e) Tiene los suficientes libros en su casa como para que haya mas de 1 millon de paginas
en total? Y en la biblioteca de la Universidad?
2. Graficar las siguientes funciones de n. Para cada funcion, establecer el rango de valores de n
para los cuales la funcion es la mas eficiente (si se pensara como el tiempo de ejecucion de un
algoritmo).
4n2 ,
log3 n, 3n , 20n, 2,
log2 n, n2/3
(b) Suponga que otro algoritmo tiene complejidad de tiempo T (n) = n2 , y que ejecutar
una implementacion del algoritmo en un computador particular toma t segundos para
procesar una entrada de tama
no n. Ahora suponga un computador que es 64 veces mas
rapido. Cual es el tama
no de entrada que puede ser procesado en t segundos por este
computador?
(c) Un tercer algoritmo tiene complejidad de tiempo T (n) = 8n, y que ejecutar una implementacion del algoritmo en un computador particular toma t segundos para procesar una
entrada de tama
no n. Ahora suponga un computador que es 64 veces mas rapido. Cual
es el tama
no de entrada que puede ser procesado en t segundos por este computador?
5. Imagine que trabajando para una compa
na muy importante necesita resolver un problema
particular mediante un algoritmo. Despues de trabajar en el problema, usted ha encontrado
tres algoritmos, A, B y C, para resolverlo. Esos algoritmos tienen los siguiente tiempos de
ejecucion para entradas de n elementos:
Algoritmo A: 4n + 10
Algoritmo B: 2n + 40
Algoritmo C: n2 + 5
(a) Ilustrar comparativamente el desempe
no de los tres algoritmos, graficando sus funciones
de costo en una grafica (puede utilizar su herramenta preferida para hacer esto).
(b) Determinar, para cada algoritmo, el rango de valores de n para los cuales ese algoritmo
se desempe
na mas eficientemente que los otros dos algoritmos.
(c) Dar la velocidad de crecimiento en notacion O para la funcion de costo de cada uno de
los algoritmos.
(d) En que caso elegira su algoritmo en funcion de la velocidad de crecimiento dada en
notacion O y estara seguro de que la eleccion es la correcta?
6. Usando la definicion de O, mostrar que a O(1) para cualquier constante natural a. Ademas,
mostrar que a O(n).
7. Indicar cuales de las siguientes afirmaciones son verdaderas y cuales son falsas:
(a) n2 O(n3 )
(b) n3 O(n2 )
(c) 2n+1 O(2n )
(d) (n + 1)! O(n!)
(e) f (n) O(n) 2f (n) O(2n )
(f) 3n O(2n )
(g) log n O(n1/2 )
(h) n1/2 O(log n)
(i) ni O(nj ) si i < j
25
log2 n, n2/3
Ayuda: usar la aproximacion de Stirling para clasificar a n!, la cual indica que log n! n log n.
10. Ordenar las siguientes funciones por velocidad de crecimiento, desde la que crece mas lentamente a la que crece mas rapidamente.
n,
n,
log n,
log log n,
log2 n, n/ log n,
(b) sum = 0;
for (i=0; i<n*n; i++)
sum++;
(c) for (i=0; i<n-1; i++)
for (j=i+1; j<n; j++) {
tmp = A[i][j];
A[i][j] = A[j][i];
A[j][i] = tmp;
}
(d) sum = 0;
for (i=1; i<=n; i++)
for (j=1; j<=n; j=j*2)
sum++
14. Obtener en notacion O el tiempo de ejecucion de peor caso de cada uno de los siguientes
algoritmos:
(a) int buscar(int *v, int n, int e) {
int i = 1;
while (i < d && e != v[i])
i++;
if (i < d)
return i;
else
return -1; // elemento no encontrado
}
(b) int recursiva(int n) {
int i, y;
if (n <= 1)
else {
for (i =
y = 2
return y
}
return n+1;
0, y = 0; i < n; i++)
* y;
+ recursiva(n/2) + recursiva(n/2);
}
15. En cada uno de los siguientes casos, encuentre velocidades de crecimiento X tal que:
(a) Si T (n) = X, entonces T (2n) = X 2 . Es decir, una velocidad de crecimiento X tal que al
duplicar el tama
no de la entrada, el tiempo obtenido es el cuadrado del tiempo original.
(b) Si T (n) = X, entonces T (2n) = X + 1. Es decir, una velocidad de crecimiento X tal
que al duplicar el tama
no de la entrada se incrementa el tiempo de ejecucion solamente
en 1.
27
Ejercicios Opcionales
Los siguientes ejercicios son opcionales y un poco mas complejos que los obligatorios. El objetivo
es lograr un mucho mejor entendimiento de los conceptos.
1. Dado un arreglo que almacena valores de tipo entero ordenados por valor, modifique la rutina
de b
usqueda binaria vista en clases para encontrar la posicion dentro del arreglo que almacena
la primera ocurrencia del valor buscado x, asumiendo que puede haber valores repetidos en el
arreglo. Su algoritmo debera hacer O(log n) comparaciones. Es decir, no aplique b
usqueda
secuencial una vez que haya encontrado una ocurrencia de x.
2. Modifique la rutina de b
usqueda binaria vista en clases para soportar buscar en un arreglo
de tama
no infinito. En particular, el algoritmo recibe como entrada un arreglo ordenado y
un valor x por el cual buscar. Si n es la posicion del valor mas peque
no en el arreglo que es
mayor o igual a x, su algoritmo debera ser capaz de determinar n en O(log n) comparaciones
en el peor caso. Explique por que su algoritmo alcanza esta cota.
3. Dise
ne un algoritmo que permita determinar si un n
umero n dado es primo o no. El tiempo
28
Logaritmos
El orden de log n es independiente de la base tomada para los logaritmos. Es decir,
loga n O(logb n)
para todo a, b > 1.
Un logaritmo crece mas lentamente que cualquier potencia positiva de n:
log n O(na )
para cualquier a > 0, pero na O(log n) para todo a > 0.
Exponenciales
Cualquier potencia na O(bn ) para todo a y para todo b > 1, pero bn O(na ) para b > 1.
Si a < b, entonces an O(bn ), pero bn O(an ).
Productos
Si f (n) O(g(n)) y h(n) es cualquier funcion distinta de cero, entonces f (n) h(n) O(g(n) h(n)).
Regla de la cadena
Las reglas precedentes pueden ser aplicadas recursivamente (una regla de cadena) sustituyendo una
funcion de n por n.
f (n)
=k
n g(n)
lim
tenemos:
1. Si k = 0 y k = entonces O(f ) = O(g) (es decir f O(g) y g O(f ))
2. Si k = 0 entonces f O(g), pero g O(f )
29
Los ejercicios marcados con * son obligatorios. Algunos de ellos pueden ser evaluados en el
correspondiente Certamen. Los ejercicios no marcados en la gua son de realizacion exclusiva
por parte del alumno. No pueden ser consultados y pueden ser evaluados en el correspondiente
Certamen. Los ejercicios marcados con ** se consideran de nivel avanzado, y no son obligatorios
(no seran evaluados). Sin embargo, se recomienda su realizacion para obtener un completo dominio
de los temas estudiados.
Listas
1.*
Implemente el TDA tLista usando listas enlazadas. Debe definir correctamente el tipo de
datos y las operaciones sobre este. Implementar las operaciones basicas sobre este TDA.
Analice el costo de tiempo de ejecucion de peor caso de cada operacion, usando notacion O.
2.* Implementar el TDA tLista usando un arreglo como estructura base. Debe definir correctamente el tipo de datos y las operaciones sobre este. Implementar las operaciones basicas
sobre este TDA. Analice el costo de tiempo de ejecucion de peor caso de cada operacion,
usando notacion O.
3.* Implementar el TDA tLista usando listas doblemente enlazadas. Debe definir correctamente
el tipo de datos y las operaciones sobre este. Implementar las operaciones basicas sobre este
TDA. Analice el costo de tiempo de ejecucion de peor caso de cada operacion, usando notacion
O.
4.*
Usando la notacion asimptotica O, haga una tabla comparando los tiempos de ejecucion
de peor caso de las operaciones para las distintas implementaciones del TDA tLista (lista
enlazada simple, lista basada en arreglos y listas doblemente enlazadas).
30
Insertar(A, x): inserta el nuevo elemento x dentro del conjunto ordenado A (el conjunto
tiene que seguir ordenado luego de la insercion).
Borrar(A, x): borra el elemento x del conjunto ordenado A (el conjunto tiene que seguir
ordenado luego del borrado).
Implemente el TDA mencionado usando un arreglo como estructura base. Las operaciones deberan implementarse de la manera mas eficiente posible (por ejemplo, la operacion Pertenencia
debera implementarse usando b
usqueda binaria). Dar una tabla con la complejidad de peor
caso y caso promedio de cada una de las operaciones del TDA. La tabla debera mostrar la
funcion de costo con y sin notacion asimptotica O.
6.** Implemente el TDA conjunto ordenado del ejercicio anterior usando una lista enlazada como
estructura base. Muestre una tabla con los tiempos de ejecucion de las operaciones. Compare
con los resultados obtenidos en las tablas de los ejercicios anteriores. Concluya respecto de
la conveniencia de usar uno u otro enfoque para la implementacion del TDA.
7.
En los siguientes ejercicios no debe asumir ninguna implementacion en particular del TDA
tLista, simplemente use las operaciones provistas por el TDA.
(a)* Implemente la operacion intToList, tal que dado un n
umero entero sin signo n (unsigned
int, es decir, un entero 0), retorne una lista de enteros en donde cada nodo de la misma
sera uno de los dgitos que componen a n. Por ejemplo, si n = 8273344, la lista generada
debera ser 8, 2, 7, 3, 3, 4, 4.
Ayuda: n%10 (se lee n modulo 10) en C le devolvera el valor del u
ltimo dgito de n.
(b)
Implemente la operacion merge, la cual toma dos listas ordenadas de enteros, L1 y L2,
y genera una tercera lista ordenada formada por los elementos de L1 y L2. Muestre el
tiempo de ejecucion de su algoritmo usando notacion asintotica.
(c)
Implemente la operacion catenate, tal que reciba como entrada dos listas de enteros L1
y L2, y retorne una tercera lista de enteros L3 que sea la concatenacion de las listas L1
y L2, en ese orden. Por ejemplo, si L1 = 5, 42, 8, 12, 3 y L2 = 12, 1, 3, 14, entonces el
resultado de la funcion debera ser L3 = 5, 42, 8, 12, 3, 12, 1, 3, 14.
(d)* Implemente la operacion rotate, que reciba como entrada una lista de enteros y un
valor entero n, y produzca como resultado otra lista que sea el resultado de rotar la lista
de entrada n veces (cada rotacion significa que el u
ltimo elemento de la lista pasa a ser
el primer elemento de la lista). Es decir, si la lista inicial es L = 5, 42, 8, 12, 3 y n = 3,
entonces el resultado debe ser L = 8, 12, 3, 5, 42.
(e)
Implemente la operacion insertarOrden, tal que reciba como entrada una lista de enteros ordenada de forma no decreciente (es decir, puede haber elementos repetidos en la
lista), y un valor entero n, y como resultado inserte el valor n en la lista pero de manera
que la lista continue siendo ordenada.
31
8.** Suponga que necesita almacenar un conjunto de datos sobre una lista enlazada. Se desea
soportar b
usquedas sobre dicho conjunto de datos. Se sabe tambien que ciertos elementos
del conjunto son buscados mas frecuentemente que otros, y que la tendencia de b
usqueda
cambia con el tiempo, en el sentido que los elementos mas frecuentemente consultados no
necesariamente son los mismos en todo momento. Modifique la implementacion de listas
enlazadas para permitir la b
usqueda eficiente de los elementos mas consultados en un momento
dado. Tambien se desea soportar la insercion eficiente de nuevos elementos.
Pilas y colas
1.*
Implemente el TDA tPila usando arreglos. Debe definir correctamente el tipo de datos y las
operaciones sobre este.
2.*
Implemente el TDA tCola usando arreglos. Recuerde que el arreglo debe manejarse circularmente en este caso (Cual es la ventaja de esto?). Debe definir correctamente el tipo de
datos y las operaciones sobre este.
3.*
Dada una u
nica pila de enteros, suponga que se realiza una secuencia entremezclada de
operaciones push, topValue y pop. La operacion push apilara los enteros del 0 al 9, de a
uno por vez y en ese orden. La operacion topValue muestra (e imprime) el valor actual
almacenado en el tope de la pila, y en este caso particular son inmediatamente seguidos por
una operacion pop. Indique cuales de las siguientes salidas podran ser producidas por una
secuencia como la descrita, y cuales no (recuerde, cada n
umero en la secuencia indica que la
operacion topValue encontro dicho n
umero en el tope actual de la pila). En los casos en que
la salida mostrada sea valida, indicar cual es la secuencia de operaciones que la genera. En
los casos en que la salida no sea valida, indicar cual es el problema.
(a)
(b)
(c)
(d)
(e)
(f)
(g)
(h)
4
4
4
2
3
3
4
4
3
3
6
5
2
7
6
3
2
2
8
6
7
6
8
2
1
1
9
7
9
8
7
1
0
0
7
4
8
5
5
0
9
5
3
8
6
4
3
5
8
7
5
9
5
9
2
6
7
6
2
3
4
2
9
7
6
8
1
1
1
1
0
8
5
9
0
0
0
0
1
9
4.* Agregue la funcion remover a los TDA tPila y tCola, de manera que reciba una estructura
de datos (pila o cola) y un objeto x, y como resultado produzca la misma pila (o cola) pero
sin ninguna ocurrencia del objeto x.
5.
Muestre en detalle como implementara una cola usando solo dos pilas. Analice los tiempos de
ejecucion de cada una de las operaciones de la cola. Su explicacion debera indicar claramente
como se interpreta la cola sobre las pilas empleadas. Use diagramas graficos para ayudar a
su explicacion.
32
6.*
Sea Q una cola de enteros no vaca, y S una pila de enteros inicialmente vaca. Use solo las
operaciones de los TDA tPila y tCola y una u
nica variable entera X para invertir el orden
de los elementos en Q.
7.
8.*
Escriba un algoritmo que tome como entrada una expresion aritmetica, la cual puede tener
como delimitadores los smbolos { y }, ( y ), y [ y ], y que indique si estos han sido usados correctamente, en el sentido que cada delimitador de apertura tenga su correspondiente
delimitador de cierre, y estos esten perfectamente anidados. Por ejemplo, para la expresion
2*[9/4*{(3+3)-2}], el uso de delimitadores es correcto, mientras que para 2*[9/4*{(3+3}-2)]
el uso es erroneo. Utilice la/las estructuras de datos mas adecuadas (pilas y/o colas) para
su solucion. Su algoritmo debera indicar informacion de error apropiada. Por ejemplo, para
la expresion erronea anterior, debera indicar que el ( de la posicion 9 de la expresion no
corresponde con el } de la posicion 13.
9.*
Escriba el algoritmo reemplazar, el cual recibe una pila de enteros A como parametro de
entrada y dos valores enteros x e y, y retorna otra pila B como resultado, la cual tiene los
mismos objetos que la pila A y en el mismo orden, salvo que cada aparicion de x ha sido
reemplazada por y. Use solo las operaciones del TDA tPila, asuma que usted no conoce
como ha sido implementado el tipo tPila. De ser necesario, solo puede usar una u
nica pila
auxiliar para llevar a cabo la operacion.
10.* Escriba el algoritmo intercambio, el cual toma dos pilas A y B como parametro y como
resultado hace que el contenido de ambas pilas se intercambie, quedando la pila A tal como
era la pila B en un princio, y viceversa. Como variable auxiliar solo puede emplear una u
nica
pila.
11.* Escriba un algoritmo que reciba una expresion aritmetica en notacion infija (correctamente
parentizada) y produzca como resultado una expresion aritmetica equivalente pero en notacion
postfija.
12.
Escriba un algoritmo que tome como entrada una expresion aritmetica en notacion postfija,
y muestre el resultado de evaluar dicha expresion.
13.
Escriba un algoritmo que transforme una expresion aritmetica en notacion postfija a una
expresion equivalente en notacion prefija.
14.* Escriba un algoritmo que reciba como entrada un string v y que indique si v es de la forma
v = w#wr , en donde w es un string de n
umeros, y wr es el reverso del string w (es decir, w
leido al reves). Emplee las estructuras de datos (pilas y/o colas) que sean necesarias.
33
15.* Escriba un programa que lea un archivo .c (es decir, un programa fuente en lenguaje C) y
determine si los smbolos {, }, [, ], ( y ) estan correctamente balanceados. Si no se encuentra
balanceado, que muestre el error indicando el smbolo faltante y las lneas involucradas en el
error.
16.** Se desea implementar dos pilas de enteros, y se dispone de un u
nico espacio de memoria
contigua de tama
no N (modelada mediante un arreglo de N enteros). Implementar ambas
pilas de manera que se pueda aprovechar al maximo el espacio disponible. Las operaciones
del TDA tPila tendran que llevar un parametro adicional que indique sobre cual de las pilas
se quiere realizar la operacion (pila 1 o pila 2). Es importante notar que las pilas deben
crecer en direcciones opuestas sobre el arreglo. Implemente ademas la operacion llenaPila,
que indique si el espacio disponible para las pilas se lleno o no. Ver la siguiente figura como
ilustracion.
PILA 1
111111
000000
000000
111111
000000
111111
000000
111111
000000
111111
000000
111111
000000
111111
PILA 2
Espacio libre
tope
base
4
9
7
8
34
Los siguientes ejercicios asumen que el alumno ha implementado los TDA correspondientes a cada
uno de los tipos de arboles (arboles generales, arboles binarios, arboles binarios de b
usqueda, arboles
AVL, arboles 2-3, heaps).
Los ejercicios marcados con * son obligatorios. Algunos de ellos pueden ser evaluados en el
correspondiente Certamen. Los ejercicios no marcados en la gua son de realizacion exclusiva
por parte del alumno. No pueden ser consultados y pueden ser evaluados en el correspondiente
Certamen. Los ejercicios marcados con ** se consideran de nivel avanzado, y no son obligatorios
(no seran evaluados). Sin embargo, se recomienda su realizacion para obtener un completo dominio
de los temas estudiados.
Arboles
Generales
1.*
Discuta las ventajas y desventajas de representar los hijos de un nodo usando una representacion de lista enlazada versus usar una representacion de lista sobre arreglos. La discucion
debera centrarse en los tiempos de ejecucion de las operaciones del arbol si se emplea cada
una de las representaciones, as como el espacio usado por cada una de las representaciones.
2.*
3.
Arboles
Binarios
1.* Escriba un algoritmo no recursivo que permita hacer un barrido por niveles de un arbol
binario. Que tipo de estructura auxiliar necesita emplear?
2.*
Escriba un algoritmo no recursivo para recorrer un arbol binario en preorden. Que tipo
de estructura auxiliar necesita emplear?
3.*
Dise
ne un algoritmo no recursivo para recorrer un arbol binario en inorden.
4.* Dise
ne un algoritmo no recursivo para recorrer un arbol binario en postorden.
5.* Escriba un algoritmo recursivo que cuente la cantidad de nodos de un arbol binario dado
como entrada.
6.* El recorrido en preorden de un determinado arbol binario (cuyos nodos han sido rotulados
A, . . . , M) produce como resultado la secuencia de nodos G E A I B M C L D F K J H, y el
recorrido inorden produce la secuencia I A B E G L D C F M K H J.
35
8.*
Se define por frontera de un arbol binario, la secuencia formada por los elementos almacenados
en las hojas de un arbol binario, tomados de izquierda a derecha. Dise
ne un algoritmo que
genere una lista (es decir, del TDA tLista) con la frontera de un arbol binario dado.
9.
Dise
ne un algoritmo que obtenga el recorrido por niveles inverso de un arbol binario dado.
En este recorrido, primero se listan (de izquierda a derecha) los nodos del u
ltimo nivel del
arbol, luego los del pen
ultimo nivel, y as sucesivamente hasta llegar a la raz.
10.
Dise
ne un algoritmo que obtenga el recorrido por niveles inverso modificado de un arbol
binario dado. En este recorrido, primero se listan (de derecha a izquierda) los nodos del
u
ltimo nivel del arbol, luego los del pen
ultimo nivel, y as sucesivamente hasta llegar a la raz.
11.
Dise
ne un algoritmo que reciba como entrada los recorridos prefijo e infijo de un arbol binario
y retorne como salida el recorrido por niveles de dicho arbol. Para obtener la solucion no se
puede construir el arbol de manera explcita.
12.* Dise
ne un algoritmo que calcule el n
umero de nodos completos de un arbol binario. Un nodo
completo es uno que tiene dos hijos no vacos.
13.
Arboles
Binarios de B
usqueda (ABB)
1.*
2.*
Para cada uno de los ABB obtenidos en el Ejercicio 1, muestre el arbol que se obtiene cuando
se borra la raz.
36
3.*
4.
Muestre cinco secuencias de insercion de los valores {1, 2, 3, 4, 5, 6, 7} tal que, cuando se inserten en un ABB inicialmente vaco, produzcan un ABB con el menor costo de b
usqueda en
el peor caso.
5.
Muestre cinco secuencias de insercion de los valores {1, 2, 3, 4, 5, 6, 7} tal que, cuando se inserten en un ABB inicialmente vaco, produzcan un ABB con el mayor costo de b
usqueda en
el peor caso.
6.*
Muestre paso a paso el ABB para los elementos 50, 25, 75, 10, 40, 60, 90, 35, 45, 70, 42,
asumiendo que los valores son insertados en ese orden y que el arbol estaba inicialmente
vaco.
7.
Muestre paso a paso el ABB para los elementos 3, 1, 4, 6, 9, 2, 5, 7, asumiendo que los valores
son insertados en ese orden y que el arbol estaba inicialmente vaco. Mostrar el resultado de
borrar la raz.
8.*
9.
10.* Muestre que si un nodo de un ABB tiene dos hijos, entonces su elemento sucesor en el arbol
no tiene hijo izquierdo y su predecesor no tiene hijo derecho.
11.* Puede reconstruirse de forma u
nica un ABB dado su recorrido inorden? Y dados el preorden
y el postorden?
37
12.* Dise
ne un algoritmo que indique si un arbol binario dado cumple las condiciones para ser un
ABB o no. Cual es el tiempo de ejecucion de su algoritmo? Use la notacion asintotica O.
13.
Dise
ne algoritmos para calcular el mnimo y el maximo elemento de un arbol binario de
b
usqueda. Cual es el tiempo de ejecucion de su algoritmo? Use la notacion asintotica O.
14.* Dise
ne un algoritmo tal que dado un ABB y dos lmites LI y LS, construya un nuevo ABB con
todos los elementos x del arbol original que cumplan con LI x LS. Su algoritmo debera
recorrer la mnima cantidad posible de nodos del arbol. Analice la complejidad temporal de
su algoritmo en el peor caso, y en el caso promedio, asumiendo que la cantidad de nodos del
arbol es n, y que N es la cantidad de nodos cuyos valores se encuentran dentro del intervalo
dado. Use la notacion asintotica O.
15.** Modifique la implementacion de los nodos de un ABB de manera que permita encontrar el
k-esimo elemento mas peque
no del arbol en tiempo promedio O(log n), en donde n es la
cantidad de nodos del ABB. Luego escriba el algoritmo que permita encontrar el k-esimo
elemento mas peque
no del arbol.
16.
Para borrar un nodo con dos hijos no vacos en un ABB, lo intercambiamos ya sea con el
elemento mas peque
no dentro de su subarbol derecho, o con el mayor elementos dentro de su
subarbol izquierdo. En un arbol de n nodos, Cual es el cantidad maxima de esos intercambios
necesarios para borrar un elemento?
17.
18.* Suponga que dispone de un conjunto estatico de n elementos (de tipo entero). Es decir,
el conjunto se conoce de antemano, y no hay insercion de nuevos elementos ni borrados de
elementos existentes. Se ha construido un ABB para el conjunto, y aprovechando que los
elementos se conocian todos al momento de construirlo, se logro que el ABB tenga la altura
mnima posible h. Suponga que se quiere resolver la siguiente operacion: Dado un elemento
k cualquiera, se quiere conocer cuantos elementos del conjunto (almacenados en el ABB) son
menores o igual a k. Que informacion necesita almacenar en los nodos del arbol para que la
operacion mencionada pueda ser resuelta en tiempo O(h)? Especifique h.
19.** Suponga que se necesita almacenar un conjunto A de n
umeros enteros ordenado de manera
ascendente. Las operaciones a soportar son:
Select(A, i): obtiene el i-esimo elemento del conjunto ordenado A;
38
Rank(A, x): obtiene la posicion que ocupa el elemento x dentro del conjunto ordenado
A. En otras palabras, se quiere computar |{y A, y < x}|.
Pertenencia(A, x): responde true si x A. Responde false en otro caso.
Sucesor(A, x): dado un n
umero entero cualquiera x, obtiene el menor elemento y A
tal que x < y.
Predecesor(A, x): dado un n
umero entero cualquiera x, obtiene el mayor elemento y A
tal que y < x.
Vacio(A): responde true si el conjunto ordenado A es vaco. Retorna false en otro
caso.
Minimo(A): devuelve el elemento x tal que y (A {x}), x < y.
Insertar(A, x): inserta el nuevo elemento x dentro del conjunto ordenado A (el conjunto
tiene que seguir ordenado luego de la insercion).
Borrar(A, x): borra el elemento x del conjunto ordenado A (el conjunto tiene que seguir
ordenado luego del borrado).
Implemente el TDA mencionado usando un ABB como estructura base. Dar una tabla con la
complejidad de peor caso y caso promedio de cada una de las operaciones del TDA. Compare
los resultados de la tabla con los obtenidos para la implementacion usando arreglos y usando
listas enlazadas de los ejercicios 5 y 6 de la Gua de Ejercicios 3.
Arboles
AVL
1.*
Dibuje el AVL resultante de insertar cada uno de los valores 20, 16, 44, 57, 93, 32, 65, 19, 8 y
17, en ese orden. El AVL es inicialmente vaco. Dibuje cada uno de los pasos de la insercion,
as como las rotaciones producidas.
2.
Dibuje el AVL resultante de insertar cada uno de los valores 35, 18, 9, 58, 14, 49, 51, 67, 60,
en ese orden. El AVL es inicialmente vaco. Dibuje cada uno de los pasos de la insercion, as
como las rotaciones producidas.
3.
Dibuje el AVL resultante de insertar cada uno de los valores 24, 14, 6, 35, 59, 17, 21, 32, 4,
7, 15, 22, en ese orden. El AVL es inicialmente vaco. Dibuje cada uno de los pasos de la
insercion, as como las rotaciones producidas.
4.*
Dibuje el AVL resultante de insertar cada uno de los valores 13, 7, 21, 15, 27, 18, 4, 11, 30,
en ese orden. El AVL es inicialmente vaco. Dibuje cada uno de los pasos de la insercion, as
como las rotaciones producidas. Luego elimine los elementos: 13, 4, 15, en ese orden.
5.*
(a) Dise
ne un algoritmo para chequear si un ABB dado cumple las condiciones establecidas
para ser un arbol AVL.
(b) Cual es el tiempo de ejecucion de su algoritmo? Use la notacion asintotica O.
6.* Para cada valor de h = 0, . . . , 4, dibuje un arbol AVL de altura h con la menor cantidad de
nodos posible.
39
Heaps
1.*
Mostrar paso a paso el resultado de insertar los elementos 10, 12, 1, 14, 6, 5, 8, 15, 3, 9, 7,
4, 11, 13, y 2 en un heap de mnimo (es decir, el heap permite encontrar el mnimo de forma
eficiente) inicialmente vaco. En cada paso, mostrar tanto la representacion de arbol como la
de arreglo.
2.*
Dado el heap del ejercicio anterior, muestre el resultado de ejecutar 3 veces consecutivas la
operacion que permite borrar el mnimo elemento del heap.
3.
Suponga un heap de mnimos inicialmente vaco (es decir, un heap en donde el menor elemento
del conjunto esta en la raz). Ejecute las siguientes operaciones en orden, mostrando el heap
resultante en cada uno de los pasos, as como las operaciones necesarias para mantener las
condiciones de un heap. Muestre en cada paso tanto la representacion de arbol como la de
arreglo.
insertar: 80, 40, 30, 60, 81, 90, 10, 25, 35
borrar m
nimo
borrar m
nimo
insertar: 50, 34
borrar m
nimo
4.*
5.* Muestre que en cualquier subarbol de un heap de maximo (es decir, permite obtener el maximo
en tiempo constante), la raz del subarbol contiene el valor mas grande de ese subarbol.
6.
Asumiendo que todos los elementos de un heap de maximo son distintos, Donde podra
residir el menor elemento del heap?
Ayuda: tenga en cuenta el resultado del ejercicio anterior.
7.
8.* Dada la secuencia 23, 17, 14, 6, 13, 10, 1, 5, 7, 12, Corresponde esta secuencia a un heap de
maximo?
9.*
Dise
ne un algoritmo tal que dado un arreglo de elementos, determine si este representa un
heap.
40
10.* Muestre que en la representacion de arreglo para un heap de n elementos, las hojas estan
almacenadas en las posiciones n/2 + 1, n/2 + 2, . . . , n.
11.
Arboles
2-3
1.*
Cual es la principal diferencia entre los arboles 1-2-3 y los arboles 2-3 vistos en clases?
2.*
Cuales son las condiciones que definen un arbol 2-3 que hacen que estos arboles sean balanceados en altura?
3.*
4.*
Inserte los siguientes elementos en orden en un arbol 2-3 inicialmente vaco: 50, 30, 90, 15,
80, 40, 70, 45, 47, 35, 33, 48, 49, 43, 42. Mostrar paso a paso el estado del arbol.
5.
Inserte los siguientes elementos en orden en un arbol 2-3 inicialmente vaco: 20, 35, 50, 43,
12, 22, 13, 14, 52, 37, 41, 18, 19, 1. Mostrar paso a paso el estado del arbol.
6.*
Arboles
B
1.*
12
14
36
53
54
85
(a) Inserte en el mismo arbol un valor entero que pueda ser almacenado en la casilla marcada
con gris.
42
Los ejercicios marcados con * son obligatorios. Algunos de ellos pueden ser evaluados en el
correspondiente Certamen. Los ejercicios no marcados en la gua son de realizacion exclusiva
por parte del alumno. No pueden ser consultados y pueden ser evaluados en el correspondiente
Certamen. Los ejercicios marcados con ** se consideran de nivel avanzado, y no son obligatorios
(no seran evaluados). Sin embargo, se recomienda su realizacion para obtener un completo dominio
de los temas estudiados.
1.*
2.*
3.*
Asuma una estrategia de hashing cerrado con M = 10. Muestre el hashing resultante de
insertar los elementos a, b, c, d, e, f, g, i en ese orden.
Asuma la siguiente funcion de hashing:
h(a) = 5, h(b) = 3, h(c) = 2, h(d) = 9, h(e) = 0, h(f ) = 7, h(g) = 9, h(i) = 9.
Tenga en cuenta cada una de las siguientes definiciones:
(a) Asuma que se ha definido p(k, i) = i
(b) Asuma que se ha definido p(k, i) = 3*i
(c) Asuma que se ha definido p(k, i) = i*i
4.* Por que la insercion de un elemento x en un hashing cerrado debe chequear las mismas
ranuras que una b
usqueda por x?
43
5.
Determine cuales de las siguientes operaciones pueden realizarse de manera eficiente usando
una estructura de hashing.
(a) Dada una clave k, encontrar el registro correspondiente a la clave sucesora (k + 1).
(b) Dada una clave k, encontrar el registro correspondiente a la clave predecesora (k 1).
(c) Dada una clave k, determinar si pertenece al conjunto de datos almacenado o no.
(d) Encontrar el registro correspondiente a la clave de valor mnimo.
(e) Obtener los registros ordenados de menor a mayor por el valor de su clave.
6.*
Suponga que necesita almacenar 100 millones de registros usando una tecnica de hashing, y
que dichos registros son suficientemente grandes (por ejemplo, requieren 1 megabyte cada uno,
como puede ser el caso de sistemas de almacenamiento de imagenes). Note que el espacio de
memoria necesario para almacenar este conjunto de datos es 100 terabytes. Como requisito,
se tiene que el tiempo de b
usqueda tiene que ser muy eficiente, dado que se debe dar acceso
a los datos a muchos usuarios a la vez (piense en los casos de facebook o flickr, que tienen
millones de usuarios simultaneos queriendo acceder a fotos). Suponga ademas que el servidor
que almacena los datos dispone en total de, digamos, 102 terabytes de memoria RAM, por lo
que la estructura de hashing se podra mantener en RAM. Cual de las tecnicas de resolucion
de colisiones usara en este caso? Hashing abierto o hashing cerrado? En cualquier caso
justifique detalladamente su respuesta.
7.*
8.*
9.
44
45
Los ejercicios marcados con * son obligatorios. Algunos de ellos pueden ser evaluados en el
correspondiente Certamen. Los ejercicios no marcados en la gua son de realizacion exclusiva
por parte del alumno. No pueden ser consultados y pueden ser evaluados en el correspondiente
Certamen. Los ejercicios marcados con ** se consideran de nivel avanzado, y no son obligatorios
(no seran evaluados). Sin embargo, se recomienda su realizacion para obtener un completo dominio
de los temas estudiados.
1.*
v9
v6
v7
v1
v4
v2
(a)
(b)
(c)
(d)
(e)
(f)
(g)
(h)
(i)
2.*
v5
v8
v10
4.
El siguiente grafo representa un conjunto de ciudades (vertices) junto a las posibles carreteras
que podran unirlas (arcos). El costo de cada arco representa el costo que tendra construir
cada carretera (en millones de dolares). Determine un sistema de caminos de menor costo
que conecte todas las ciudades. Es esta solucion u
nica? Justifique su respuesta.
v3
10
v6
15
v1
30
5
v4
12
v7
8
14
v2
5.*
20
v5
v4
v7
10
v6
v8
v1
v3
v5
v2
v9
8
5
v11
47
v12
7
4
v10
Considere un grafo con 1 millon de nodos, con 6.5 millones de arcos. Estudie la conveniencia
de usar una representacion de matrz de adyacencia o listas de adyacencia, teniendo en cuenta
el uso de espacio de cada una de las alternativas.
7.*
En aplicaciones reales, los nodos de un grafo pueden estar rotulados de manera arbitraria. Por
ejemplo, si el grafo representa una red de carreteras entre ciudades, entonces los vertices estan
rotulados con los nombres de las ciudades. Sin embargo, las representaciones computacionales
de grafos vistas en clases (es decir, listas y matriz de adyacencia) necesitan que los vertices
esten enumerados de manera consecutiva en el intervalo entero [1..n], donde n es el n
umero
de nodos del grafo. Dise
ne una estructura de datos tal que:
(a) Dado el rotulo de un vertice, permita determinar si el vertice ya ha sido enumerado o no.
En caso que s, debe retornar el n
umero asignado a ese rotulo. En caso que no haya sido
enumerado a
un, debe asignarle el siguiente codigo disponible al vertice. (si el vertice
es el i-esimo a ser enumerado, entonces obtiene el valor i como codigo). Esto es para
traducir un rotulo (nombre reconocible por el usuario) en un nombre interno reconocible
por el sistema.
(b) Dado un n
umero entero que representa un vertice del grafo, permita obtener el rotulo
original del grafo. Esto es usado para traducir el nombre interno del vertice (el codigo)
en un nombre (rotulo) reconocible por el usuario.
Dise
ne la estructura de datos de manera que haga un uso eficiente de espacio, y permita
resolver la operaciones solicitadas de manera eficiente en cuanto a tiempo de ejecucion.
8.
Dada la representacion de listas de adyacencia de un grafo, y asumiendo que los vertices del
grafo son representados como n
umeros enteros, estudie la eficiencia de las siguientes alternativas para representar los nodos adyacentes a un nodo dado, teniendo en cuenta las operaciones
del TDA tGrafo definidas en clases.
48
(c) Arbol
binario de b
usqueda.
(d) Arbol
AVL.
(e) Arbol
2-3.
9.*
10.* Considere un grafo que representa una red social como la de facebook, en donde las personas
son representadas por los vertices del grafo, y la amistad entre dos personas es representada
como un arco en el grafo entre los vertices correspondientes.
(a) Que tipo de grafos usara para este caso, grafos dirigidos o no dirigidos? Argumente su
respuesta.
(b) Usando las operaciones definidas en clases para el TDA tGrafo, muestre pseudocodigo
que permita mostrar todos los amigos de una persona dada.
(c) En este grafo, Como se podra encontrar a la persona con mas amigos? Que tipo de
estructura de datos usara para soportar esta operacion de manera eficiente?
(d) Dadas dos personas p1 y p2 , usando las operaciones definidas para el TDA tGrafo muestre
pseudocodigo para determinar si esas personas tienen al menos un amigo en com
un. El
tiempo de ejecucion de su algoritmo tiene que ser eficiente.
11.* Considere un grafo que representa una red social como la de twitter, en donde las personas
son representadas por los vertices del grafo, y el hecho de que una persona siga a otra en la
red social es representada como un arco en el grafo entre los vertices correspondientes.
(a) Que tipo de grafos usara para este caso, grafos dirigidos o no dirigidos? Argumente su
respuesta.
(b) Usando las operaciones definidas en clases para el TDA tGrafo, muestre pseudocodigo
que permita mostrar todos los seguidores de una persona dada. Cree usted que las
estructuras de datos para grafos estudiadas son adecuadas para soportar esta operacion?
(c) Usando las operaciones definidas en clases para el TDA tGrafo, muestre pseudocodigo
que permita mostrar todos las personas a las que sigue una persona dada.
(d) En este grafo, Como se podra encontrar a la persona con mas seguidores? Como se
podra encontrar a la persona que sigue a mas personas?
49
(e) Dadas dos personas p1 y p2 , usando las operaciones definidas para el TDA tGrafo muestre
pseudocodigo para determinar si esas personas tienen al menos un amigo en com
un. El
tiempo de ejecucion de su algoritmo tiene que ser eficiente.
12.* Considere un grafo que representa la web de la siguiente manera: cada pagina web se representa con un vertice en el grafo y, si una pagina web p1 contiene un link a la pagina p2 , existe
un arco que une dichos vertices en el grafo.
(a) Que tipo de grafos usara para este caso, grafos dirigidos o no dirigidos? Argumente su
respuesta.
(b) Usando las operaciones definidas en clases para el TDA tGrafo, muestre pseudocodigo
que permita mostrar todas las paginas apuntadas por una pagina dada.
(c) Usando las operaciones definidas en clases para el TDA tGrafo, muestre pseudocodigo
que permita conocer de la manera mas eficiente posible cuantas paginas apuntan a cada
pagina de la web. Muestre el tiempo de ejecucion de su algoritmo usando notacion O.
50
Los ejercicios marcados con * son obligatorios. Algunos de ellos pueden ser evaluados en el
correspondiente Certamen. Los ejercicios no marcados en la gua son de realizacion exclusiva
por parte del alumno. No pueden ser consultados y pueden ser evaluados en el correspondiente
Certamen. Los ejercicios marcados con ** se consideran de nivel avanzado, y no son obligatorios
(no seran evaluados). Sin embargo, se recomienda su realizacion para obtener un completo dominio
de los temas estudiados.
1.*
2.*
3.*
4.*
Suponga que necesita ordenar registros cuyo campo clave son strings (arreglos de char en
C). El orden deseado es orden lexicografico, de menor a mayor. Como definira la funcion
antesQue en este caso?
51
5.*
6.*
Usando demostracion por induccion, demuestre que insertion sort siempre produce un arreglo
ordenado.
7.
Escriba un algortimo de insertion sort para arreglos de valores enteros. Asuma que la entrada
es un stack de n
umeros enteros, la cual se quiere ordenar en forma no descendente (el menor
valor de la pila debera quedar en el tope de la pila). Su algoritmo solo puede usar una cantidad
constante de enteros y una cantidad constante de pilas. Su algoritmo debera ejecutar en
tiempo O(n2 ) en el peor caso.
8.*
9.*
Recuerde que la cantidad de intercambios de celdas que hace el algoritmo Selection Sort visto
en clases es O(n), para un arreglo de entrada con n registros. Esto es porque el algoritmo
no chequea que el valor mnimo en el sub arreglo A[i..n] no este en la posicion A[i]. Esto es,
podra realizar intercambios innecesarios.
(a) Modifique el algoritmo para que no haga intercambios innecesarios.
(b) Mejora esta modificacion el tiempo de ejecucion del algoritmo Selection Sort? Acote
de manera asintotica la cantidad de intercambios que hace el algoritmo en el mejor de
los casos.
(c) Escriba dos programas con las dos variantes de Selection Sort (la variante de clases y la
variante aqu propuesta). Cual es la variante mas rapida?
10.* Recuerde que un algoritmo de ordenamiento se llama estable si el orden original de los valores
repetidos del arreglo se preservan luego de ordenarse. De los algoritmos de ordenamiento estudiados: Insertion Sort, Bubble Sort, Selection Sort, Shellsort, Mergesort, Quicksort, Heapsort,
y Radix Sort, Cuales son estables, y cuales no? Para cada algoritmo, describa por que es o
no es estable. En los casos en que el algoritmo podra hacerse estable con un cambio menor
en su implementacion, explique ese cambio.
11.* Cualquier algoritmo de ordenamiento puede hacerse estable si alteramos los valores de manera
que los valores duplicados se hagan u
nicos de manera que la primera ocurrencia de los valores
originales duplicados sea menor que la segunda ocurrencia, el cual es a su vez menor que
la tercera, y as siguiendo. En el peor caso, es posible que los n valores de entrada tengan
el mismo valor. Dise
nar un algoritmo para modificar los valores del arreglo de manera que
los valores resultantes nos dan el mismo ordenamiento que los valores originales, el resultado
sea estable (en el sentido que valores repetidos conservan su orden original) y el proceso de
alterar los valores toma tiempo (n) y usa solo una cantidad O(1) de espacio adicional.
52
12.* Dada una implementacion de Quicksort que toma como pivote al elemento que esta en la
mitad del arreglo a ordenar, dar una permutacion de 0, . . . , 7 que hace que Quicksort tenga
su peor caso en tiempo de ejecucion.
13.* Asuma que L es un arreglo, que length(L) retorna el n
umero de elementos del arreglo, y
que qsort(L, i, j) ordena los elementos de L desde la posicion i a la posicion j usando el
algoritmo Quicksort. Cual es la complejidad de tiempo en caso promedio para cada uno de
los siguientes fragmentos de codigo?
(a) for (i=0; i<length(L); i++)
qsort(L, 0, i);
(b) for (i=0; i<length(L); i++)
qsort(L, 0, length(L)-1);
Implementar Mergesort para el caso en que la entrada este en una lista enlazada.
53
18.* Para el algoritmo Counting Sort visto en clases, Que se puede decir de los valores relativos
de M y n para que la idea sea efectiva? Si M < n, Cual es el tiempo de ejecucion de este
algoritmo?
19.* Explicar que algoritmos de ordenamiento usara en cada uno de los siguientes casos (en cada
caso pueden haber varias opciones):
(a) La cantidad de intercambios entre elementos del arreglo sea mnima.
(b) No se puede usar espacio extra sobre el arreglo.
(c) Se quiere garantizar peor caso O(n log n)
(d) No se pueden comparar elementos entre s, solo se pueden verificar los dgitos que conforman las claves.
(e) Se quiere tener buen comportamiento en los casos en que el conjunto de entrada este
casi ordenado.
54