You are on page 1of 6

Estructuras de Datos. Deber No.

1
Francisco Lara
Fecha de Entrega: Da de la Primera Prueba
Recuerde que log n significa en esta clase, logaritmo en base 2.
1. Analizar los siguiente algoritmos (indicando el n
umero de pasos que toma
cada uno de ellos como una funcion f (n)):
(a) void ej1(int n)
{
int a;
for(int i = 0; i < n; i+=2)
{
a = i;
}
}
(b) void ej2(int n)
{
int a;
for(int i = 0; i < n * n; i++)
{
for(int j = 0; j < i; j++)
{
a = i;
}
}
}
2. Probar que 3n3 + 2n2 log n = (n3 ).
3. El algoritmo A usa 2n log n operaciones, mientras que el algoritmo B usa
n2 operaciones. Para que valores de n, A es mas rapido que B? Para
que valores de n, B es mas rapido que A?
4. Probar que si g(n) = (logb f (n), entonces g(n) = (log f (n)).
5. Probar que 2n = O(n!).
6. (a) Usar la
afica de f (x) = 1/x para probar que
n
X
1
i=2

< loge n.

(b) Usar la
afica de f (x) = 1/x para probar que
loge n <

n
X
1
i=1

(c) Probar que


n
X
1
i=1

= (log n).

7. Cu
al de las siguientes afirmaciones son verdaderas o falsas. Probar o dar
contrajemplo. (f y g son funciones reales, g(n) 6= 0.)
(a) Si limn
O(g(n)).

f (n)
g(n)

existe y es igual a un n
umero real L, entonces f (n) =

(b) Si f (n) = O(g(n)) entonces limn


n
umero real L.
(c) Si limn
(g(n)).

f (n)
g(n)

f (n)
g(n)

existe y es igual a un

existe y es igual a un n
umero real L, entonces f (n) =

8. Resolver el problema 22 de la Introduccion de Lewis y Denenberg (1991).


9. Resolver el problema 23 (a) y (c) de la Introduccion de Lewis y Denenberg.
10. Resolver el problema 33 de la Introduccion de Lewis y Denenberg.
11. Resolver el problema 25 de la Introduccion de Lewis and Denneberg.
12. Si f (n) = (g(n)) entonces limn
real L.

f (n)
g(n)

existe y es igual a un n
umero

13. La funci
on factorial se define como n! = n(n 1)!, si n > 0 y 0! =
1. Escribir una funci
on recursiva para la funcion factorial (en C++) y
estudiar su complejidad.
14. En clase estudiamos la funcion de Fibonacci y su complejidad como funcion
recursiva. Escribir ahora una funcion iterativa (esto es usando un loop)
en C++ y analizar su complejidad.
15. El algoritmo de Euclides (300 A.C.) para calcular el maximo com
un divisor
(mcd) dice:
Para calcular el m
aximo com
un divisor entre dos n
umeros m y n, m > n
proceder de la siguiente manera. Sustraer repetidamente el menor del
mayor hasta que la diferencia d sea menor que n. Luego, hacer lo mismo
que antes pero con d en lugar de n y con n en lugar de m. (Note que
en este momento m y n se han actualizado.) Continuar hasta que los dos
n
umeros m y n sean iguales. El resultado m es el maximo com
un divisor
de los dos n
umeros originales.
2

Por ejemplo, para calcular el mcd entre 58 y 18, usando el algoritmo de


Euclides, procedemos como se indica:
(a) 58 18 = 40; 40 18 = 22; 22 18 = 4.
(b) 18 4 = 14; 14 4 = 10; 10 4 = 6; 6 4 = 2.
(c) 4 2 = 2.
Por lo tanto, mcd entre 58 y 18 es 2. Implementar este algoritmo iterativamente y estudiar su complejidad.
16. Este ejercicio es acerca de la pila con arreglo.
(a) Crear la interfaz de una pila de doubles en un archivo pila arreglo.h
(b) Implementar la pila de dobles con arreglo en un archivo pila arreglo.cpp.
Por ahora no preocuparse por los errores generados por pila llena o
pila vacia.
(c) Utilizando la pila de dobles definida anteriormente, implementar la
calculador RPN explicada en clase. Por ahora no preocuparse por
errores generados por la division por 0.
Ejemplo 1.
./calc
3 enter
5 enter
+
8
10 enter
-2
2 enter
*
-4
q
Ejemplo 2.
2 enter
~
-2
4 enter
+
2
q
Ejemplo 3.
2.5 2 3 * * 1.5 ~ /
6
3

15
-1.5
-10
q
17. Implementar una pila ligada de doubles y utlizarla para correr la misma
calculadora del ejercicio anterior.
18. Implementar una cola ligada con template. En un archivo conductor de pila.cpp,
utilizar el siguiente programa como test. No preocuparse por ahora de errores generados por cola vaca.
#include "Cola.h"
#include <iostream>
using namespace std;
template<class T>
void proceso_cola(Cola<T>& cola, T valor1, T valor2, T valor3)
{
cout << "numero de objectos es "<< cola.obtener_longitud() << "\n";
cola.hace_cola(valor1);
cout << "numero de objectos es "<< cola.obtener_longitud() << "\n";
cola.hace_cola(valor2);
cout << "numero de objectos es "<< cola.obtener_longitud() << "\n";
cola.hace_cola(valor3);
cout << "numero de objectos es "<< cola.obtener_longitud() << "\n";
cout << "\n";
cout << "Primero en la cola es " << cola.el_primero();
cout << "\n";
cout << "numero de objectos es "<< cola.obtener_longitud() << "\n";
cout << "\n";
cout << "Primero en la cola es " << cola.es_atendido() << "\n";
cout << "numero de objectos es " << cola.obtener_longitud() << "\n";
cout << "Primero en la cola es " << cola.es_atendido() << "\n";
cout << "numero de objectos es "<< cola.obtener_longitud() << "\n";
cout << "Primero en la cola es " << cola.es_atendido() << "\n";
cout << "numero de objectos es "<< cola.obtener_longitud() << "\n";
cout << "\n";
}
int main()
{
Cola<string> cola1(100);
string s1 = "Jorge";
string s2 = "Ana";
string s3 = "Esteban";
proceso_cola(cola1, s1, s2, s3);
4

Cola<int> cola2(100);
proceso_cola(cola2, 1, 2, 3);
return 1;
}
El output debe ser:
numero
numero
numero
numero

de
de
de
de

objectos
objectos
objectos
objectos

es
es
es
es

0
1
2
3

Primero en la cola es Jorge


numero de objectos es 3
Primero en la cola
numero de objectos
Primero en la cola
numero de objectos
Primero en la cola
numero de objectos

es
es
es
es
es
es

Jorge
2
Ana
1
Esteban
0

numero
numero
numero
numero

es
es
es
es

0
1
2
3

de
de
de
de

objectos
objectos
objectos
objectos

Primero en la cola es 1
numero de objectos es 3
Primero en la cola
numero de objectos
Primero en la cola
numero de objectos
Primero en la cola
numero de objectos

es
es
es
es
es
es

1
2
2
1
3
0

Las partes que requieren programacion, compilarlas y correrlas. Una vez que
compilen y corran correctamente, escribirlas a mano. Entregar todos los ejercicios a mano. No imprimir programas. No es necesario entregar los programas
electr
onicamente, pero guardarlos en un lugar seguro para una posible revision.
Es permitido colaborar para estudio, pero no es permitido entregar el codigo
hecho por otros.
No entregar ejercicios que no compilen.
No entregar ejercicios que no corran correctamente de acuerdo a las especificaciones.
5

No entregar ejercicios hechos por otros.


No otorgar soluciones a otros.
Escribir el nombre de las personas que colaboraron en la solucion de un
problema. Especificar en que problemas hubo la colaboracion.

You might also like