You are on page 1of 54

ILI-134 / INF-134 Estructuras de Datos, 2015-1

Guas de Ejercicios
Profesor: Diego Arroyuelo
Universidad Tecnica Federico Santa Mara
Campus Santiago San Joaqun

2015-1

Gua de Ejercicios 0: Lenguaje de Programaci


on C

Todos los ejercicios de esta gua son obligatorios.

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);

2. Cual es la salida del siguiente programa?


#include <stdio.h>
int main ()
{
char pax[] = "Estructuras de Datos";
printf("%s %s\n",pax,&pax[11]) ;
puts(pax);
puts(&pax[11]);
return 0;
}
3. De acuerdo a las reglas de precedencia del lenguaje C, indicar el resultado de la evaluaci
on
de las siguientes expresiones
(a) 6 + 2 * 3 - 4 /2.
(b) 7 - 6 / 3 + 2 * 3 / 2 - 4 / 2.
(c) 7 * 10 - 5 % 3 * 4 + 9.
(d) 15 * 14 - 3 * 7.
(e) -4 * 5 * 2.
2

(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

8. Un sistema de ecuaciones lineales


ax + by = c
dx + ey = f.
se puede resolver como:
x=

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);

Sentencias Condicionales: if-else, switch


1. Que puede siempre afirmarse que es verdad si en una sentencia if en C, cuya condicion es:
(v >= 0 && v <= s)
se ejecuta la rama del verdadero?
(a) (v < 0 || v > s)
(b) (v < 0 && v > s)
(c) (v >= 0 || v <= s)
(d) (v >= 0 && v <= s)
(e) No se ejecuta nunca la rama del verdadero con esa condicion.
(f) Ninguna de las anteriores.
2. Que valor se asigna a la variable consumo en la sentencia if siguiente si velocidad es 120?
if (velocidad > 80)
consumo = 10.00;
else if (velocidad > 100)
consumo = 12.00;
else if (velocidad > 120)
consumo = 15.00;
3. Explique las diferencias entre las sentencias de la columna de la izquierda y de la columna de
la derecha. Para cada una de ellas deducir el valor final de x si el valor inicial de x es 0.
if (x >= 0)
x++;
else if (x >= 1)
x += 2;

if (x >= 0)
x++;
if (x >= 1)
x += 2;

4. Escribir un programa que lea dos n


umeros y visualice el mayor, utilizando el operador ternario
?:.
5. Determinar si el caracter asociado a un codigo introducido por teclado corresponde a un
caracter alfabetico, dgito, signo de puntuacion, caracter especial o caracter no imprimible

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

(c) i > T && !a


(d) i > T || !a
(e) Nada, porque no puede haber una expresion condicional as.
(f) Ninguna de las anteriores.
2. Cual es la salida del siguiente segmento de programa?
for (cuenta = 1; cuenta < 5; cuenta++)
printf ("%d ", 2*cuenta);
3. Cual es la salida de los siguientes bucles?
(a) for (n = 10; n > 0; n = n-2) {
printf ("Hola ");
printf (" %d \n", n);
}
(b) double n = 2.0;
for (; n > 0; n = n-0.5)
printf (" %f \n", n);
4. Considere el siguiente segmento de programa:
int i = 1;
while (i <= n) {
if ((i%n) == 0) {
++i;
}
}
printf("%d \n", i);
(a) Cual es la salida si n es 0?
(b) Cual es la salida si n es 1?
(c) Cual es la salida si n es 3?
5. Cual es la salida producida por los siguientes segmentos de programa?
(a) int n, m;
for (n = 1; n <= 10; n++)
for (m = 10; m >= 1; m--)
printf ("%d veces %d=%d\n", n, m, n*m);
(b) for (i = 0; i < 10; i++)
printf (" 2 * %d = %d\n", i, 2 * i);
(c) for (i = 0; i <= 5; i++)
printf(" %d ", 2 * i + 1);
putchar(\n);
7

(d) for (i = 1; i < 4; i++) {


printf(" %d ", i);
for (j = i; j >= 1; j--)
printf(" %d \n", j);
}
(e) for (i = 1; i <= 5; i++) {
printf(" %d ", i);
for (j = i; j >= 1; j-=2)
printf(" %d \n", j);
}
(f) for (i = 3; i > 0; i--)
for (j = 1; j <= i; j++)
for (k = i; k >= j; k--)
printf("%d %d %d\n", i, j, k);
(g) for (i = 3; i > 0; i--)
for (j = 1; j <= i; j++)
for (k = i; k >= j; k--)
printf("%d %d %d\n", i, j, k);
(h) for (i = 1; i <= 3; i++)
for (j = 1; j <= 3; j++) {
for (k = i; k <= j; k++)
printf("%d %d %d\n", i, j, k);
putchar(\n);
}
(i) i = 0;
while (i*i < 10) {
j = i;
while (j*j < 100) {
printf("%d\n", i+j);
j *= 2;
}
i++;
}
printf("\n*****\n");
6. Escribir un programa que pida ingresar dos enteros, a y b, e imprima por pantalla un
rectangulo de base a y altura b usando asteriscos (*).
7. Modificar el programa anterior, de modo que ademas se lea una palabra de cinco letras y se
imprima en el centro del rectangulo.
8. Escribir un programa que pida ingresar un entero a e imprima por pantalla un rombo de lado
a. Por ejemplo, si a es 5, debera mostrar:

*
*
*
*
*

*
*
*

*
*
*
*
*
*
*

*
*
*
*
*
*
*
*
*

*
*
*
*
*
*
*

*
*
*
*
*

*
*
*

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!

Escriba un programa que permita ingresar un valor de x y de n, y muestre la aproximaci


on
al valor ex hasta el n-esimo termino de la serie.
14. El algoritmo de Euclides para encontrar el maximo com
un divisor (mcd) de dos n
umeros
trabaja de la siguiente manera. Dados los enteros a y b (a > b), si a/b = q1 y el resto es
r1 = 0, se tiene que mcd(a, b) = mcd(b, r1 ). Luego, si b/r1 = q2 y el resto es r2 = 0, se tiene
que mcd(b, r1 ) = mcd(r1 , r2 ). El proceso continua hasta que se obtiene resto 0. El resto del
paso anterior es entonces el mcd de a y b. Escribir un programa que calcule el mcd de dos
n
umeros dados.

15. Escribir un programa que calcule la suma de la serie


1+

1 1
1
+ + + ,
2 3
n

en donde n es el menor n
umero natural tal que
por teclado, tal que > 0.

1
n

< , para una constante

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

(a) La variable x en la funcion main.


(b) El parametro y en la funcion cube.
(c) La funcion cube.
(d) La funcin main.
2. Escribir una funcion que tenga un argumento de tipo int y retorne P si dicho n
umero es
positivo, o N en otro caso.
3. Escriba una funcion que reciba como argumento un entero n, y retorne la suma de los primeros
n naturales.
4. Escriba la funcion maximo, que tome como entrada dos n
umeros enteros, y retorne el mayor
de esos dos n
umeros.
5. Escriba una funcion que calcule el mcd de dos n
umeros usando el algoritmo de Euclides.
6. Escribir una funcion que calcule el coeficiente binomial a partir de dos n
umeros enteros.
7. Escribir una funcion que calcule el valor de la progresion:
1 + x + x2 + x3 + + xn ,
para dos argumentos x (float) y n (int).
8. Escribir una funcion que tenga como argumentos dos n
umeros naturales n y m, y que devuelva
como resultado el producto m n. La multiplicacion debe realizarse empleando la suma y
no el producto.
9. Escribir una funcion que tenga como argumentos dos n
umeros naturales n y m, y que devuelva
como resultado la division entera m/n. La division debe realizarse empleando la resta y no
la division.
10. Definir una funcion llamada hipotenusa que calcule la longitud de la hipotenusa de un
triangulo rectangulo dados los otros dos lados del triangulo. Usar esta funcion en un programa
que solicite el ingreso de datos (los lados de los triangulos) y luego calcule la longitud de la
hipotenusa de cada triangulo ingresado.
11. Suponga la siguiente definicion:
#define true 1
#define false 0
Escribir una funcion multiplo que determine para un par de enteros si el segundo entero es
m
ultiplo del primero. La funcion debera tomar dos argumentos enteros y retornar true si
el segundo es m
ultiplo del primero, y false en otro caso. Usar la funcion multiplo en un
programa que permita ingresar una serie de pares de enteros e imprima el mensaje adecuado
por cada par.
12. (a) Implementar la funcion celsius que retorna el equivalente en grados Celsius de una
temperatura en grados Fahrenheit dada.
11

(b) Implementar la funcion fahrenheit que retorna el equivalente en grados Fahrenheit de


una temperatura en grados Celsius dada.
(c) Usar las funciones para escribir un programa que imprima una tabla mostrando las
equivalencias Fahrenheit de todas las temperaturas desde 0 a 199 grados Celsius y otra
tabla mostrando las equivalencias Celsius de todas las temperaturas desde 32 a 231
grados Fahrenheit.
13. Hacer un programa que simule los lanzamientos de una moneda. Para cada lanzamiento de la
moneda el programa deber imprimir cara o sello. Hacer que el programa lance la moneda
un n
umero determinado de veces y cuente el n
umero de veces que sale cada lado de la moneda
y lo imprima. Para simular los lanzamientos, el programa debera llamar a una funcion flip
que no toma argumentos y retorna 0 para sello y 1 para cara. Para definir la funcion flip,
usar el operador % en C, y las siguientes funciones predefinidas:
rand() definida en <stdio.h> genera un n
umero entero pseudo random entre 0 y
RAND MAX (constante simbolica definida en <stdlib.h>).
srand(unsigned int) definida en <stdlib.h> establece la semilla para la generacion
de n
umeros pseudo random. Distintas semillas generan distintas secuencias de n
umeros.
Usar la funcion time (definida en <time.h>) como semilla de la funcion srand para tener
semillas diferentes en cada ejecucion:
srand(time(NULL));

/* define la semilla */

i = rand();

/* genera numero random */

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

Cuales de las siguientes asignaciones causa un error de compilacion?


(a) p = &i;
(b) p = *&i;
(c) p = &*i;
(d) i = *&*p;
(e) i = *&p;
(f) i = &*p;
(g) p = &*&i;
(h) q = *&*p;
(i) q = **&p;
(j) q = *&p;
(k) q = &*p;
3. Identificar los errores en los siguientes segmentos de programa. Asuma que s2 es un string al
que ya se le ha asignado un valor.
(a) char *f(char *s) {
char ch = A;
return &ch;
}
(b) char *s1;
strcpy(s1, s2);
(c) char *s1;
s1 = (char *) malloc(sizeof(char) * strlen(s2));
strcpy(s1, s2);
4. Dadas las declaraciones e inicializaciones:
int intArray[] = {1, 2, 3}, *p = intArray;
mostrar el contenido de ambas variables despues de ejecutar las siguientes sentencias.
(a) *p++;
(b) (*p)++;
(c) *p++; (*p)++;
5. Definir la funcion swap, que permita intercambiar los valores de dos variables enteras pasadas
como parametro.

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

(i) Asumir que nPtr apunta al comienzo del arreglo numeros.


(j) Que direccion es referenciada por nPtr + 8? Que valor se encuentra almacenado en
esa direccion?
(k) Asumir que nPtr apunta a numeros[5]. Que direccion es referenciada por nPtr -= 4?
Que valor se encuentra almacenado en esa direccion?
3. Encontrar el error o situaciones erroneas en cada uno de los siguientes segmentos de programa.
Asumir:
int *zPtr;
int *aPtr = NULL;
void *sPtr = NULL;
int number, i;
int z[5] = {1, 2, 3, 4, 5 };
sPtr = z;
(a) ++zPtr;
(b) /* usa el puntero zPtr para obtener el primer valor de un arreglo;
asumir zPtr inicializado con la direccion base del arreglo z */
number = zPtr;
(c) /* asigna el elemento 2 del arreglo (el valor 3) a number; asumir
zPtr inicializado con la direccion base del arreglo z */
number = *zPtr[2];
(d) /* imprime el arreglo z completo; asumir zPtr inicializado con la
direccion base del arreglo z */
for (i = 0 ; i <= 5; i++)
printf(%d, zPtr[i]);
(e) /* asigna el valor apuntado por sPtr a number */
number = *sPtr;
(f) ++z;
4. Suponiendo las siguientes declaraciones:
int i, j, k;
int Primero[21], Segundo[21];
int Tercero[6][12];
determinar la salida producida por cada uno de los siguientes segmentos de programa.
(a) for (i = 1; i <= 6; i++)
scanf("%d",&Primero[i]);
for(i = 3; i > 0; i--)
printf("%4d", Primero[2*i]);
.................
Suponga que la entrada de datos es la siguiente: 3, 7, 4, - 1, 0, 6.
15

(b) scanf ("%d", &k);


for(i = 3; i<=k;)
scanf("%d",&Segundo[i++]);
j = 4;
printf("%d %d\n",Segundo[k] ,Segundo[j+1]);
.................
Suponga que la entrada de datos es la siguiente: 6, 3, 0, 1, 9.
(c) for(i = 0; i < 3; i++)
for(j = 0; j < 12; j++)
Tercero[i][j] = i+j+1;
for(i = 0; i < 3; i++) {
j = 2;
while (j < 12) {
printf ("%d %d %d \n", i, j, Tercero[i][j]);
j +=3;
}
}
5. Escribir una funcion que intercambie los valores almacenados en la fila i-esima con los de la
fila j-esima de un arreglo de dos dimensiones, para valores i y j dados.
6. Escribir un programa que rellene una tabla con los 80 primeros n
umeros primos, y luego los
visualice. Use las funciones programadas en ejercicios anteriores que considere necesarias para
resolver el problema.
7. Escribir una funcion que reciba un arreglo de enteros como parametro, y devuelva el menor
elemento del arreglo.
8. Escribir una funcion que reciba un arreglo de enteros y un n
umero entero x como parametro,
y devuelva -1 en caso que no exista ninguna ocurrencia del valor de x en el arreglo. En otro
caso, debe devolver la primera posicion del arreglo que contenga el valor de x.
9. Hacer un programa que permita insertar un caracter en un arreglo de caracteres en una
posicion dada. Se inserta en el lugar del arreglo que el usuario del programa solicite y debe
hacerse lugar al nuevo caracter, desplazando todos los caracteres una posicion en el arreglo,
perdiendose el u
ltimo caracter del arreglo. El programa debera definir y usar una funcion
para ingresar los datos, otra para hacer la insercion y otra para mostrar el arreglo antes y
despues de la insercion.
10. Hacer un programa que permita borrar un caracter en un arreglo de caracteres. Se borra en
el lugar del arreglo que el usuario del programa solicite y deben desplazarse los caracteres
una posicion desde la posicion dada hasta la posicion final del arreglo. El programa debera
definir y usar (o reusar) una funcion para ingresar los datos, otra para hacer la supresion y
otra para mostrar el arreglo antes y despues de la misma.
11. Escribir una funcion que reciba como parametro un arreglo de n
umeros de tipo float. Dicha
funcion debe ordenar el arreglo en forma ascendente.

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

la altura y el peso; luego debera calcular y mostrar la edad en a


nos de la persona y su ndice
de masa corporal, as como en que categora se encuentra de acuerdo a su IMC. El IMC se
calcula con la formula:
peso en kg
IMC =
.
(altura en metros)2
Se considera bajo de peso cuando el IMC es menor que 18.5; normal cuando es mayor o igual
a 18.5 y menor que 25; con sobrepeso cuando es mayor o igual que 25 y menor a 30, y obeso
cuando el IMC es 30 o mas.
8. Hacer un programa que permita opcionalmente: (a) ingresar los datos de hoteles en un arreglo
mientras el usuario lo desee; (b) mostrar por pantalla los datos de cada uno de los hoteles
ingresados. Usar cuando sea necesario las funciones definidas en puntos anteriores.

Manejo de Memoria Din


amica
1. Dadas las siguiente declaraciones:
int *s, *q, t, ar1[10];
char *m= "HOLA", *n, l, ar2[11];
struct {
int len;
char *str;
} *p, ar3[10];
(a) Describa y grafique el efecto de las siguientes sentencias indicando en cada caso si son
correctas. Muestre ademas la salida estandar.
scanf("%i",&t); // suponga que el usuario ingresa 3
q = &t;
*s = *q;
s = q;
for (t = 0; t < 10, t++)
scanf("%c", &ar2[t]);//se ingresa H O L A M U N D O
scanf("%i", ar1); // el usuario ingresa 8
printf("%c", *m);
printf("\n %s", m);
ar2[10] = \0
printf("\n %s", ar2);
printf("\n %s", &ar2[3]);
ar2[0] = \0;
printf("\n %s", ar2);
printf("\n %s", &ar2[5]);
for (t = 0; t < 10, t++)
scanf("%i", ar3[i].len); //se ingresa 3 4 5 6 3 4 5 6 5 5
scanf("%s", ar3[0].str); // se ingresa PEPE
ar3[0].str= (char*) malloc(sizeof(char)*11);
19

scanf("%s", ar3[0].str); // se ingresa CHAU


scanf("%c", &(ar3[0].str[2])); // se ingresa U
ar3[0].str = 12345678910;
printf("\n %c", ar3[0].str[5]);
(b) Describa el efecto de las siguientes expresiones, teniendo en cuenta que se ha realizado
la asignacion p = ar3. Grafique las variables involucradas, e indique graficamente en
cada caso el elemento referenciado por la expresion.
i.
ii.
iii.
iv.
v.
vi.
vii.

++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.

Tabla de Precedencia y Asociatividad de los Operadores en C


La siguiente tabla muestra la precedencia y asociatividad de los operadores en C. Los operadores
que aparecen en una misma lnea tienen la misma precedencia. La precedencia disminuye de arriba
hacia abajo en la tabla.
Operadores
() . [] ->
! ~ ++ -- + - * & (tipo) sizeof
* / %
+ << >>
< <= > >=
== !=
& (and bit a bit)
^
|
&&
||
?:
= += -= *= /= %= &= ^= |= <<= >>=
,
21

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

Gua de Ejercicios 1: Tipos de Datos Abstractos

Todos los ejercicios de esta gua son obligatorios.

1. Piense en al menos 5 objetos de uso cotidiano y definalos como TDAs.


2. Defina un TDA que permita representar n
umeros racionales. Defina las operaciones de obtencion del numerados y denominador del n
umero, una operacion para colocar el n
umero en
0, y una operacion que permita imprimir el n
umero racional. Implementar el TDA usando
lenguaje C++. Ademas, usando lenguaje C++, implemente las siguientes operaciones que
hagan uso adecuado del TDA definido: suma, resta, multiplicacion y division de n
umeros
racionales.
3. Defina un TDA para strings de caracteres. El TDA por usted definido debera tener las
funciones tpicas a ejecutar sobre strings (para calcular su longitud, imprimir el string, borrar
el valor actual del string, etc.). Defina cada funcion en terminos de sus entradas y salidas.
Ademas, defina dos representaciones tpicas para strings. Finalmente, implemente su solucion
empleando el lenguaje C++.
4. Defina un TDA que permita representar polinomios de la forma p(x) = c1 xe1 + c2 xe2 + +
cn xen , donde en > > e2 > e1 0. Especifique las operaciones basicas a llevar a cabo
sobre polinomios. Proponga al menos dos maneras de representar polinomios. Compare dichas
alternativas respecto de las operaciones que necesita para el TDA. Implemente un algoritmo
que toma dos polinomios y produce como resultado el polinomio resultante de sumar los
polinomios dados. Su algoritmo debe respetar el TDA definido para los polinomios.

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

3. Suponga que se mide el rendimiento de un programa utilizando alg


un seguimiento de su
ejecucion. Luego, en funcion de lo observado se optimizan las partes mas utilizadas del
codigo, teniendo especial cuidado de no modificar el algoritmo subyacente. Que esperara
usted obtener?
(a) Una ganancia de eficiencia por un valor constante, sea cual fuere el problema resuelto.
(b) Una ganancia que se vaya volviendo proporcionalmente mayor a medida que aumente el
tama
no de la entrada.
Justifique su respuesta.
4. (a) Suponga que un algoritmo particular tiene complejidad de tiempo T (n) = 3 2n , 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?
24

(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

(j) 22n O(2n )


8. Demostrar las siguientes inclusiones estrictas:
O(1) O(log n) O(n) O(n log n) O(n2 ) O(nk ) O(2n ) O(n!)
9. Ordenar las siguientes funciones por velocidad de crecimiento, desde la que crece mas lentamente a la que crece mas rapidamente.
4n2 ,

log3 n, n!, 3n , 20n, 2,

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,

n log2 n, (1/3)n , (3/2)n , 33, n2

11. Demostrar las siguientes propiedades de la notacion O:


(a) Si f1 (n) O(g1 (n)) y f2 (n) O(g2 (n)), entonces f1 (n) + f2 (n) O(max (g1 (n), g2 (n))).
(b) a, b > 1, se tiene que loga n O(logb n)
(c) Si f (n) O(g(n)) y g(n) O(h(n)) f O(h(n)).
12. Para cada uno de los siguientes pares de funciones, determinar si f (n) O(g(n)). Justificar su
respuesta mostrando el desarrollo que lo llevo a tomar la decision. Asuma que los logaritmos
son en base 2.
(a) f (n) = log (n2 ); g(n) = log n + 5
(b) f (n) = log 10; g(n) = 10
(c) f (n) = 3n ; g(n) = 2n

(d) f (n) = n; g(n) = log (n2 )


(e) f (n) = (log n)2 ; g(n) = log n
13. Determinar (usando notacion asintotica) el tiempo de ejecucion en el peor caso de los siguientes fragmentos de codigo. Asuma que todas las variables son de tipo int. Exprese el
tiempo en funcion de la variable n.
(a) sum = 0;
for (i=0; i<3; i++)
for (j=0; j<n; j++)
sum++;
26

(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

(c) Si T (n) = X, entonces T (n2 ) = X + 1. Es decir, una velocidad de crecimiento X tal


que al elevar al cuadrado el tama
no de la entrada se incrementa el tiempo de ejecucion
solamente en 1.
(d) Si T (n) = X, entonces T (n + 1) = 2X. Es decir, una velocidad de crecimiento X tal
que al incrementar en 1 el tama
no de la entrada se duplica el tiempo de ejecucion.

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

de ejecucion de su algotimo debera ser O( n) en el peor caso.


4. Dada una secuencia de n n
umeros enteros a1 < a2 < < an , escriba un algoritmo eficiente
que permita decidir si existe i tal que ai = i. Analice su algoritmo empleando la notacion
asintotica O.
5. Implemente la funcion de b
usqueda binaria vista en clases, as como tambien el algoritmo
de b
usqueda secuencial sobre un arreglo ordenado. Lleve a cabo experimentos que permitan
comparar la eficiencia experimental de ambos algoritmos de b
usqueda. Las b
usquedas a
realizar deberan ser generadas de manera aleatoria (aseg
urese que la cantidad de b
usquedas
realizadas sea relevante). Muestre resultados midiendo:
tiempos de ejecucion de los algoritmos usando las funciones de la biblioteca times.h de
C.
N
umero de elementos del arreglo comparadas por cada uno de los algoritmos.
Muestre sus resultados para arreglos ordenados de tama
no 10, 100, 1.000, 10.000, 100.000,
1.000.000, 10.000.000 y 100.000.000. Para que tama
nos de entrada es mas eficiente cada
uno de los algoritmos? Ademas, compare los resultados experimentales con los resultados del
analisis asintotico. Que conclusiones puede sacar de esa comparacion?

28

Ordenamiento de funciones por su velocidad


de crecimiento
Potencias
Las potencias de n son ordenadas de acuerdo al exponente: na O(nb ) si y solo si a b.

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.

Por ejemplo: log log n O( log n)

Regla del lmite


Si existe el lmite

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

Gua de Ejercicios 3: Listas, Pilas, Colas

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).

5.** Suponga que se necesita almacenar un conjunto A de n


umeros enteros, el cual esta ordenado
de manera ascendente. Las ope raciones a soportar son:
Select(A, i): obtiene el i-esimo elemento del conjunto ordenado A;
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.

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.

Un palndromo es un string que se lee igual en ambas direcciones. Ejemplos de palndromos


son oso, radar, sometemos, entre otros. Defina un algoritmo pal
ndromo, el cual
permita decidir si un string (representado como arreglo de char) es palndromo o no. Para
su solucion debe emplear estructuras de datos como pilas y colas.

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

17.* Asuma que se utiliza una pila para representar un n


umero entero, tal como se explica a
continuacion. Cada dgito del n
umero es un elemento de la pila, siendo el dgito menos
significativo del n
umero el que se encuentra en la base de la pila, el dgito mas significativo
el que se encuentra en el tope de la pila, y el resto de los dgitos se encuentran en orden en
la pila. Por ejemplo, para representar el n
umero 4978, la pila sera la siguiente:

tope

base

4
9
7
8

(a) Escriba un algoritmo que reciba dos n


umeros enteros representados por sendas pilas, y
produzca como resultado una nueva pila que represente la suma de ambos n
umeros de
entrada.
(b) Escriba un algoritmo que reciba dos n
umeros enteros representados por sendas pilas, y
produzca como resultado una nueva pila que represente la resta de ambos n
umeros de
entrada.
En ambos casos la operacion debe realizarse dgito a dgito sobre la pila, no es valido transformar las pilas en los correspondientes n
umeros enteros.

34

Gua de Ejercicios 4: Arboles

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.*

Escriba un algoritmo recursivo para calcular la altura de un arbol general.

3.

Escriba un algoritmo no recursivo para calcular la altura de un arbol general.

4.* Escriba un algoritmo recursivo para calcular el grado de un arbol general.


5.

Escriba un algoritmo que cuente la cantidad de hojas de un arbol general.

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

(a) Dibuje el arbol binario correspondiente.


(b) De el recorrido en postorden sobre dicho arbol.
(c) Dise
ne un algoritmo para obtener el recorrido en postorden de un arbol dado el recorrido
en preorden e inorden sobre el mismo. No se puede reconstruir el arbol explcitamente
para obtener el recorrido postorden.
7.

Es posible generar un arbol binario a partir u


nicamente de uno de sus recorridos preorden,
inorden o postorden? Y a partir de dos recorridos diferentes (examinar todos los pares
posibles)? De los algoritmos para los casos que sean realizables.

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.

Demuestre por induccion que el maximo n


umero de nodos en un arbol binario de altura h es
2h+1 1.

Arboles
Binarios de B
usqueda (ABB)
1.*

Para cada una de las siguientes secuencias de n


umeros enteros, muestre el ABB obtenido
cuando estos valores son insertados uno por uno en el orden dado, asumiendo que el arbol
esta inicialmente vaco. Muestre el arbol resultante de cada una de las inserciones.
(a) 1, 2, 3, 4, 5, 6, 7.
(b) 4, 2, 1, 3, 6, 5, 7.
(c) 1, 6, 7, 2, 4, 3, 5.

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.*

(a) Cual de los ABB del Ejercicio 1 producira el menor costo de b


usqueda en el peor caso?
(b) Cual de los ABB del Ejercicio 1 producira el mayor costo de b
usqueda en el peor caso?
En ambos casos explique las razones. Ademas, medite acerca de los tipos de secuencias de
inserciones que producen buenos/malos ABB.

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.*

Dado un ABB que almacena n


umeros enteros y cuya raz almacena el valor 2, y considerando
que el camino para encontrar un elemento en un ABB es u
nico, decida cual de las siguientes
listas corresponden a elementos visitados en los nodos del arbol durante el recorrido realizado
para encontrar el nodo que almacena el valor 363.
(a) 2, 252, 401, 398, 330, 344, 397, 363
(b) 2, 399, 387, 219, 266, 382, 381, 278, 363
(c) 2, 252, 397, 398, 330, 344, 401, 363

9.

Dado un ABB que almacena n


umeros enteros en el rango de 1 a 1000 decida cual de las
siguientes dos listas corresponden a elementos vistos en los nodos del arbol durante el recorrido
realizado para encontrar el nodo que almacena el valor 363.
(a) 924, 220, 911, 244, 898, 258, 362, 363
(b) 925, 202, 911, 240, 912, 245, 363
(c) 935, 278, 347, 621, 299, 392, 358, 363

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.

Suponga que tiene un conjunto de n valores enteros k1 k2 kn , con los cuales se


quiere construir un ABB (ya dispone de todos los elementos antes de formar el arbol).
(a) Cual es la mnima altura que puede tener un arbol binario de n nodos?
(b) Dise
ne un algoritmo tal que dado el conjunto de elementos ordenado (por ejemplo, en
un arreglo), inserte los elementos en un ABB tal que la altura del arbol resultante sea
mnimizada.
(c) Cual es el tiempo de ejecucion de su algoritmo? Use notacion asintotica O.

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

7.** Implemente el TDA conjunto ordenado (ver u


ltimo ejercicio de la seccion de ABB) usando un
AVL 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, as como la implementacion usando ABB de la presente gua.

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.*

Cuales es el mnimo y el maximo n


umero de elementos en un heap de altura h?

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.

Teniendo en cuenta la representacion de arreglo de un heap, Es cualquier arreglo de enteros


ordenado ascendentemente un heap de mnimo?

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.

Dada la representacion de arreglo de un heap de mnimo, dise


ne un algoritmo que permita
encontrar y borrar el maximo elemento del heap. Hace falta recorrer todos los elementos del
arreglo para encontrar el maximo?

12.* Implemente una cola FIFO usando un heap.


13.* Implemente una pila LIFO usando un heap.
14.** Implemente el TDA conjunto ordenado (ver u
ltimo ejercicio de la seccion de ABB) usando un
heap 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, as como la implementacion usando ABB y AVL de la presente gua.
Todas las operaciones del TDA conjunto ordenado pueden resolverse eficientemente usando
un heap?

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.*

Defina un struct en C que implemente un nodo de un arbol 2-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.*

En una lista enlazada, el largo de la lista afecta de manera lineal en el tiempo de b


usqueda
de un elemento en la lista. En los arboles, como afecta la cantidad de hijos que puede tener
un nodo del arbol en la altura del arbol?.

7.** Implemente el TDA conjunto ordenado (ver u


ltimo ejercicio de la seccion de ABB) usando
un arbol 2-3 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, as como la implementacion usando ABB, AVL y heap de la
presente gua.
41


Arboles
B
1.*

Dado el siguiente Arbol


B que puede almacenar a lo mas 4 elementos por nodo:
47

12

14

36

53

54

85

103 145 200

115 123 129 137

147 163 175 177

213 217 267 289

(a) Inserte en el mismo arbol un valor entero que pueda ser almacenado en la casilla marcada
con gris.

(b) Muestre el Arbol


B resultante de insertar el valor 270.

42

Gua de Ejercicios 5: Hashing y TDA Diccionario

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.*

Implemente la estrategia de hashing abierto usando lenguaje C.

2.*

Implemente la estrategia de hashing cerrado usando lenguaje C y siguiendo las consideraciones


vistas en clase para que su implementacion sea general respecto de la funcion de hashing a
usar, la cantidad de ranuras que tendra la tabla HT , y la tecnica de generacion de las ranuras
de la tabla a inspeccionar para una clave dada.

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.*

Dada una estructura de hashing cerrado lineal, dise


ne una estrategia de insercion que permita
reducir la varianza en el costo de b
usqueda de los elementos almacenados en el hashing.

8.*

Asuma una estructura de hashing cerrado lineal. Dise


ne una estrategia que utilice un u
nico
recorrido lineal sobre el arreglo para recuperar todas las celdas que han sido liberadas (las
que podran ahora ser marcadas como nunca usadas).

9.

Asuma una estructura de hashing cerrado lineal. Modifique la implementacion de la operacion


de borrado de elementos para que cada elemento borrado permita recuperar una celda de la
estructura como nunca usada.

10.** 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;
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.

44

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).
Estudie la conveniencia de implementar este TDA usando hashing. Para esto, discuta cuales
de las operaciones mencionadas pueden implementarse de manera eficiente.
11.** (a) Implemente una tecnica de hashing abierto, suponiendo M =1.000.000.
(b) Inserte 10 millones de claves, suponiendo que esos elementos estan enumerados entre 1
y 100.000.000. Defina una funcion de hashing adecuada para su caso.
(c) Calcule el largo promedio de las listas obtenidas con esta tecnica.
(d) Dada su implementacion y el resultado obtenido en el punto anterior, Es necesario
implementar alguna estructura de datos mas compleja que las listas enlazadas? Por
que?

45

Gua de Ejercicios 6: Grafos

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.*

Dado el siguiente grafo:


v3

v9

v6
v7

v1

v4

v2

(a)
(b)
(c)
(d)
(e)

(f)

(g)

(h)
(i)
2.*

v5

v8

v10

Dar su representacion de matrz de adyacencia.


Dar su representacion de listas de adyacencia.
Mostrar 1 camino simple de longitud 9, un camino cerrado de longitud 11.
Mostrar tres subgrafos distintos basados en el conjunto de vertices {v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 }.
Para cada subgrafo, indique la cantidad de componentes conexas que tiene.
Mostrar tres subgrafos distintos basados en el conjunto de vertices {v1 , v2 , v3 , v5 , v6 , v8 , v10 }.
Para cada subgrafo, indique la cantidad de componentes conexas que tiene. Cual es
el mnimo n
umero de componentes conexas que tendra cualquier subgrafo sobre este
conjunto de vertices? Y cual sera el n
umero maximo posible de componentes conexas?
Mostrar un recorrido en profundidad del grafo, comenzando desde el nodo v1 , y un
recorrido en amplitud comenzando desde el nodo v4 . Mostrar en ambos casos el arbol
resultante del recorrido.
Muestre, de ser posible, 3 ciclos distintos de largo 6. Con ciclos distintos nos referimos
a que si consideramos los ciclos de a pares, hay al menos un vertice de un ciclo que no
esta en el otro.
Muestre la maxima cantidad de ciclos distintos de largo 7 que encuentre.
De que longitud es el ciclo mas largo que puede encontrar en el grafo dado?

Considere el grafo dirigido G = (V, A) definido como


V = {a, b, c, d, e, f, g}
y
E = {(g, b), (d, c), (f, e), (b, e), (a, b), (e, g), (b, f ), (d, g), (a, f ), (c, b), (e, d), (b, c)}.
Responda a las siguientes preguntas:
46

(a) Dibuje dicho grafo dirigido.


(b) Muestre la representacion de listas de adyacencias para el grafo dirigido.
(c) Muestre, de ser posible, dos caminos cerrados simples de longitud al menos 5 cada uno.
3.*

Implemente el TDA tGrafo (seg


un las operaciones vistas en clases) usando las siguientes
representaciones:
(a) Listas de adyacencia
(b) Matrz de adyacencia
(c) Para cada una de las representaciones de los puntos anteriores, use notacion O para
expresar el tiempo de ejecucion de cada una de las operaciones del TDA.

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

Dado el siguiente grafo:


3

v4

v7

10

v6

v8

v1

v3

v5

v2

v9

8
5

v11

47

v12
7

4
v10

(a) Dar su representacion de matrz de adyacencia.


(b) Dar su representacion de listas de adyacencia.
(c) Mostrar un recorrido en profundidad del grafo, comenzando desde el nodo v1 , y un
recorrido en amplitud comenzando tambien desde el nodo v1 .
(d) Mostrar un arbol de extension de costo mnimo obtenido mediante el algoritmo de
Kruskal.
(e) Mostrar un arbol de extension de costo mnimo obtenido mediante el algoritmo de Prim,
comenzando desde el vertice v1 . Repita el procedimiento comenzando desde un vertice
arbitrario a su eleccion.
(f) Cual es el costo del arbol de extension mnimo en los dos puntos anteriores? Hay alguna
diferencia entre los costos obtenidos? Podra haber alguna diferencia? Justifique sea
cual sea su respuesta.
(g) Use el algoritmo de Dijkstra para encontrar los caminos de costo mnimo entre el nodo
v4 y el resto de los nodos del grafo.
6.*

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

(a) Lista enlazada.


(b) Hashing cerrado.

(c) Arbol
binario de b
usqueda.

(d) Arbol
AVL.

(e) Arbol
2-3.
9.*

Discuta implementaciones eficientes de los siguientes algoritmos sobre un grafo arbitrario:


(a) Algoritmo de Kruskal.
(b) Algoritmo de Prim.
En particular, considere representaciones y estructuras de datos que permitan obtener de
manera eficiente el proximo arco a considerar por el algoritmo. Discuta el tiempo de ejecucion
total de cada uno de los algoritmos usando las estructuras de datos propuestas.

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

Gua de Ejercicios 7: Algoritmos de Ordenamiento

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.*

Suponga un arreglo de registros cuyas claves son los siguientes n


umeros enteros:
[8, 9, 7, 9, 3, 2, 3, 8, 4, 6]
Ejecutar los algoritmos de ordenamiento tal como se implementaron en clases, paso a paso
(mostrando el arreglo resultante en cada paso), suponiendo las definicion del tipo tipoRegistro
vista en clases y la siguiente definicion:
int antesQue (tipoRegistro *r1, tipoRegistro *r2) {
return r1->k < r2->k;
}
(a) Insertion sort.
(b) Selection sort.
(c) Bubble sort.
(d) Merge sort.
(e) Quick sort (asumiendo que el pivote es el elemento que est en la mitad del arreglo en
cada caso).
(f) Heap sort.

2.*

Repita el ejercicio 1 suponiendo que:


int antesQue (tipoRegistro *r1, tipoRegistro *r2) {
return r1->k > r2->k;
}

3.*

Repita el ejercicio 1 suponiendo que:


int antesQue (tipoRegistro *r1, tipoRegistro *r2) {
return r1->k <= r2->k;
}

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.*

Dado el siguiente arreglo de n


umeros enteros:
[189, 979, 932, 238, 346, 226, 643, 738, 132, 179, 400, 099, 238, 009],
ejecutar el algoritmo Radix Sort paso a paso para obtener un arreglo ordenado.

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.*

Al implementar insertion sort, se podra usar una b


usqueda binaria para localizar la posicion
dentro de los primeros i 1 elementos del arreglo en la cual el i-esimo elemento del arreglo
debera ser insertado. Como afectara esto al n
umero de comparaciones realizadas? Como
afectara el uso de una b
usqueda binaria al tiempo de ejecucion de insertion sort?

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);

14.* Imagine un conjunto de n tornillos (todos de distinto tama


no) almacenados en un cajon.
Imagine otro cajon en donde se han almacenado las n tuercas correspondientes a los tornillos
(cada tornillo tiene su tuerca). Se quiere encontrar la tuerca correspondiente a cada tornillo.
Las diferencias de tama
no entre cada tuerca o cada tornillo puede ser muy pequen
na para
detectarlas a simple vista, as que no podemos resolver el problema mediante comparacion de
tuercas entre s o tornillos entre s. La u
nica posibilidad para llevar a cabo las comparaciones
entre tuercas y tornillos es intentar atornillar un tornillo en una tuerca. Esta operacion nos
permite determinar si el tornillo corresponde a la tuerca (es decir, ambos son del mismo
tama
no), si el tornillo es mas peque
no que la tuerca, o que el tornillo es mas grande que
la tuerca. Dise
ne un algoritmo eficiente para encontrar el tornillo que corresponde a cada
tuerca.
15.* Dise
nar un algoritmo eficiente para ordenar un conjunto de n
umeros con valores en el rango
0 a 30.000. Se sabe que no hay n
umeros duplicados. Use la menor cantidad de memoria
posible.
16.* Cual de las siguientes operaciones pueden implementarse mas eficientemente si primero se ordena el conjunto de n
umeros sobre los que operan? Para cada operacion, describa brevemente
un algoritmo que la implemente, y establezca su complejidad asimptotica.
(a) Encontrar el valor mnimo.
(b) Encontrar el valor maximo.
(c) Calcular la media aritmetica (promedio),
(d) Encontrar la mediana (es decir, el valor que estara al medio si el conjunto estuviera
ordenado).
(e) Encontrar la moda (es decir, el valor que se repite mas veces que el resto).
17.

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

You might also like