Sie sind auf Seite 1von 5

Complejidad Temporal, Estructuras de Datos y Algoritmos

Prctica 1
Eficiencia y Complejidad
Ejercicio 1
Sean dos algoritmos alg1 y alg2 que realizan la misma de tarea de calcular el promedio de edad de un grupo de personas que solicit el
pasaporte en el ao 2015. Cada uno de estos algoritmos est codificado de forma diferente, por lo cual, el tiempo de ejecucin para el
peor caso de alg1 es T1 (n) = 10.000n mientras que el de alg2 es T2(n) =n2.
Con que cantidad de personas alg1 es mejor que alg2? Y a la inversa? Fundamente su respuesta.

Ejercicio 2
Dadas las siguientes funciones ordenarlas segn sus velocidades de crecimiento.
a. T1(n) = n*log2(n)
b. T2(n)= (1/3)n
c. T3(n) =2n+n2
d. T4(n) = (3/2)n
e. T5(n) = (log2(n))2
f. T6(n) = log2(n)
g. T7(n) = n+log2(n)
h. T8(n) = n1/2
i. T9(n) = 3n
Para poder ordenarlas, utilice el graficador de funciones que se encuentra en http://fooplot.com/.
Dado que el graficador solo trabaja con logaritmos en base 10 (log o log10) utilice el cambio de base para convertir los logaritmos (tal
como se explica en: http://es.wikipedia.org/wiki/Logaritmo#Cambio_de_base). Bsicamente:

Log b x
Log a x a 1, b 1
Log b a

Ejercicio 3
Determinar si las siguientes sentencias son verdaderas o falsas, justificando la respuesta.
a. 3n es de O(2 n)
b. n/log2(n) es de O(log2(n))
c. n 1/2 + 10 20 es de O (n 1/2)
d. n+ log2 (n) es de O(n)
e. Si p(n) es un polinomio de grado k, entonces p(n) es O(nk). Pista: Si p(n)=ak nk + ... + a1n + a0, utilizar como constante a M =
|ak| + ... + |a1| + |a0|

3n 17, n 100
f. tiene orden lineal
317, n 100
n 2 , n 100
g. tiene orden cuadrtico
n, n 100
h. 2 n+1 es de O (2 n)
i. 2 2n es de O (2 n)

Ejercicio 4
Se necesita generar una permutacin random de los n primeros nmeros enteros. Por ejemplo [4,3,1,0,2] es una permutacin legal,
pero [0,4,1,2,4] no lo es, porque un nmero est duplicado (el 4) y otro no est (el 3). Presentamos tres algoritmos para solucionar este
problema. Asumimos la existencia de un generador de nmeros random, ran_int (i,j) el cual genera en tiempo constante, enteros entre i
y j inclusive con igual probabilidad. Tambin suponemos el mensaje swap () que intercambia dos datos entre si. Si bien los tres

1
Complejidad Temporal, Estructuras de Datos y Algoritmos

algoritmos generan permutaciones random legales, tenga presente que por la forma en que utilizan la funcion ran_int algunos de ellos
podran no terminar nunca, mientras otro s.
public class Ejercicio4 {
private static Random rand = new Random();

public static int[] randomUno(int n) {


int i, x = 0, k;
int[] a = new int[n];
for (i = 0; i < n; i++) {
Boolean seguirBuscando = true;
while (seguirBuscando) {
x = ran_int(0, n - 1);
seguirBuscando = false;
for (k = 0; k < i && !seguirBuscando; k++)
if (x == a[k])
seguirBuscando = true;
}
a[i] = x;
}
return a;
}

public static int[] randomDos(int n) {


int i, x;
int[] a = new int[n];
Boolean[] used = new Boolean[n];
for (i = 0; i < n; i++) used[i] = false;
for (i = 0; i < n; i++) {
x = ran_int(0, n - 1);
while (used[x]) x = ran_int(0, n - 1);
a[i] = x;
used[x] = true;
}
return a;
}

public static int[] randomTres(int n) {


int i;
int[] a = new int[n];
for (i = 0; i < n; i++) a[i] = i;
for (i = 1; i < n; i++) swap(a, i, ran_int(0, i - 1));
return a;
}

private static void swap(int[] a, int i, int j) {


int aux;
aux = a[i]; a[i] = a[j]; a[j] = aux;
}

/** Genera en tiempo constante, enteros entre i y j con igual probabilidad.


*/
private static int ran_int(int a, int b) {
if (b < a || a < 0 || b < 0) {Console.WriteLine("Parametros invalidos"); return 0;}
return a + (rand.Next(b - a + 1));
}

public static void main(String[] args) {


Console.WriteLine(randomUno(1000));
Console.WriteLine(randomDos(1000));
Console.WriteLine(randomTres(1000));
}
}
a. Determinar que algoritmos podran no terminar nunca. Tenga presente, que para esos algoritmos, el peor de los casos, sera
el que no terminen nunca.
b. Calcular el tiempo de ejecucin para el / los algoritmos que s terminan.

2
Complejidad Temporal, Estructuras de Datos y Algoritmos

Ejercicio 5
Para cada uno de los algoritmos presentados:
a. Expresar en funcin de n el tiempo de ejecucin
b. Establecer el orden de dicha funcin usando notacin big-Oh.
En el caso de ser necesario tenga presente que:
n
n n 1 6n 3
9n 2 n 1
i4
i 1 30

n
2 n n 1 2n 1
i
i 1

6

1.
public static void uno (int n) {
int i, j, k ;
int [] [] a, b, c;
a = new int [n] [n];
b = new int [n] [n];
c = new int [n] [n];
for ( i=1; i<=n-1; i++) {
for ( j=i+1; j<=n; j++) {
for ( k=1; k<=j; k++) {
c[i][j] = c[i][j]+ a[i][j]*b[i][j];
}
}
}
}

2.
public static void dos (int n){
int i, j, k, sum;
sum = 0;
for ( i=1; i<=n; i++) {
for ( j=1; j <= i*i; j++) {
for ( k=1; k<= j; k++) {
sum = sum + 1;
}
}
}
}

Ejercicio 6
Para cada uno de los algoritmos presentados calcule el T(n).
1. 2.
int c = 1; int c = n;
while ( c < n ) { while ( c > 1 ) {
algo_de_O(1); algo_de_O(1);
c = 2 * c; c = c / 2;
} }

3.
int x=1;
for (int i = 1; i < n; i = i+4)
for (int j = n; j > 1; j = |j/4|)
for (int k = 1; k < n; k = k*2)
x = x+1;

3
Complejidad Temporal, Estructuras de Datos y Algoritmos

Ejercicio 7
Considere la siguiente especificacin de operaciones de una lista y su recorredor:

Clase Lista, ListaEnlazada y ListaConArreglo:


elemento(pos) #Retorna el elemento de la posicin indicada (la posicin va desde 0
hasta n-1) o IndexError en caso de no poder retornarlo.
agregar (elem, pos) #Agrega el elemento en la posicin indicada.
eliminar (pos) #Elimina el elemento de la posicin indicada o IndexError en caso de
no poder eliminarlo.
esVacia() #Retorna true si la lista est vaca, false en caso contrario.
incluye (elem) #Retorna true si elem est contenido en la lista, false en caso
contrario.
recorredor() #Retorna una instancia de la clase Recorredor.
getTamanio () #Retorna la longitud de la lista.

Clase Recorredor:
comenzar () #Se prepara para recorrer los elementos de la lista.
elemento () #Retorna el elemento actual.
proximo () #Avanza al prximo elemento de la lista.
fin() # Determina si lleg o no al final de la lista.
agregar(elem) #Agrega el elemento en la posicin actual.
eliminar() #Elimina el elemento actual.

a. Implemente (pase por mquina) una clase abstracta llamada Lista y Recorredor de acuerdo a la especificacin dada.

4
Complejidad Temporal, Estructuras de Datos y Algoritmos

b. Escriba una clase llamada ListaConArreglo como subclase de Lista, de manera que implemente todos los mtodos
definidos en la superclase haciendo uso de arreglos.

c. Escriba una clase llamada ListaEnlazada como otra subclase de Lista, de manera que implemente todos los mtodos
definidos en la superclase pero haciendo uso de una estructura recursiva. En este caso la lista tendr una referencia al
elemento inicial. Luego, se definir otra clase recursiva que contenga el elemento y que referencie a una instancia similar a s
misma.

d. Es posible implementar el mtodo incluye en la clase Lista de manera que solo utilice otras operaciones de lista y no
dependa de la estructura interna elegida en las subclases? Si fuera posible, funcionaria el envo de este mensaje a un objeto
de tipo ListaEnlazada?

Ejercicio 8
Sea la siguiente especificacin de una pila:

poner(elem) #Agrega elem a la pila.


sacar() #Elimina y devuelve el elemento en el tope de la pila.
tope() #Devuelve el elemento en el tope de la pila sin eliminarlo.
EsVacia() #Retorna true si la pila est vaca, false en caso contrario.
1. Implemente (pase por mquina) la clase Pila (utilizando alguna subclase de Lista) de acuerdo a la especificacin dada.

Ejercicio 9
Sea la siguiente especificacin de una cola:

poner(elem) #Agrega elem a la cola.


sacar() #Elimina y devuelve el primer elemento de la cola.
tope() #Devuelve el elemento en el tope de la cola sin eliminarlo.
esVacia() #Retorna true si la cola est vaca, false en caso contrario.
1. Implemente (pase por mquina) la clase Cola (utilizando alguna subclase de Lista) de acuerdo a la especificacin dada.

Das könnte Ihnen auch gefallen