Ejercicios sobre cálculo de complejidad

Anuncio
Ejercicios sobre cálculo de complejidad
20 de noviembre de 2002
1.
Calcula el número de pasos que realiza cada uno de los siguientes
segmentos de código. Después, expresa el coste asintótico de cada uno
de ellos.
a) j=k-2;
i=j*12;
printf("%d\n",i);
b) for (i=0;i<n;i++)
printf("%d\n",i);
c) for (i=0;i<10;i++)
for (j=0;j<n;j++)
printf("%d\n",i+j);
d ) for (i=0;i<100;i++)
q=i+j;
e) for (i=0;i<n;i++)
for (j=0;j<n;j++)
for (k=0;k<n;k++) {
q=i+j*k;
printf("%d\n",q);
}
f ) for (i=1;i<=n;i++)
{
printf("%d\n",i);
for (j=n;j>0;j--)
for (k=0;k<n-10;k++)
q=i+2j*k;
}
1
g) for (i=0;i<n;i++)
for (j=0;j<n;j++)
acum+=A[i][j];
k=0;
while (k<n) {
acum-=k;
k++;
}
h) i=1;
while (i*i<n)
i++;
i ) i=n;
while (i>0) {
printf("%d",i);
i/=2;
}
2.
Demuestra las siguientes relaciones:
a)
17 ∈ O(1)
b) n(n − 1)/2 ∈ O(n2 )
c)
3n + log n ∈ O(n)
d)
3n + log n 6∈ O(log n)
3n + log n ∈ Ω(n)
√
f)
n + 2n ∈ O(n)
√
√
g)
n + 2n 6∈ O( n)
e)
3.
Demuestra las siguientes relaciones encontrando los valores n0 y c tales
que cumplen la definición de O grande. Elige los valores mı́nimos, en
el sentido que n0 − 1 y c, o n0 y d < c no cumplan la relación.
a) n2 es O(0,001n3 )
b)
25n4 − 19n3 + 13n2 − 106n + 77 es O(n4 )
c)
2n+10 es O(2n )
d ) n10 es O(3n )
2
4.
Indica el número de veces que se ejecutan los siguientes bucles, en
función de a, b y c:
a) for (i=a;i<=b;i++)
b) for (i=a;i>=b;i--)
c) for (i=a;i<=b;i+=c)
d ) i=a; while (a<b) {i++;}
5.
Desarrolla los siguientes sumatorios:
a)
d)
g)
n
X
i
i=3
n X
n
X
b)
1
i
i=3
n n−1
X
X
i=1 j=1
i=0 j=0
n
X
n X
m
X
n2 + n − 2
i=0
6.
e)
n−2
X
h)
c)
3i
f)
2n
X
i=0
n
X
1
(n + i)2
i=1
ij
i)
i=0 j=0
n
X
i=1
i+
n(n + 1)
2
Dada la siguiente definición de tipos de datos, que implementa el tipo
“número complejo”, “vector de números complejos” y “matriz cuadrada de números complejos”:
typedef struct {
float real,comp;
} TComplejo;
typedef TComplejo VTComp[NVmax];
typedef TComplejo MTComp[NMmax][NMmax];
a)
Implementa las siguientes funciones:
void sumaVC(VTComp A, VTComp B, int tam);
void sumaMC(MTComp A, MTComp B, int tam);
void multiplicaMC(MTComp A, MTComp B, MTComp C, int tam);
donde tam indica en el primer caso el número de elementos del
vector y en el segundo y tercero la dimensión de la matriz cuadrada (tam×tam). La función sumaVC calcula la suma vectorial
de A y B, almacenando el resultado en A. La función sumaMC hace
lo mismo, pero con matrices. La función multiplicaMC calcula el
producto matricial de A y B, almacenando el resultado en C.
3
b)
Calcula la complejidad asintótica de ambas funciones.
7.
Según el Principio de encasillamiento (o pigeonhole), si una función
f tiene n entradas distintas, pero tiene menos de n salidas distintas,
entonces existen dos entradas a y b tal que a 6= b y f (a) = f (b).
Escribe un programa para encontrar un par de elementos de entrada a
y b tal que f unc(a) = f unc(b), donde func es una función que puedes
llamar y que recibe como parámetro un número entero entre 1 y N , y
devuelve números menores que N . Estudia el coste asintótico para el
mejor y el peor de los casos.
8.
Implementa una función que, dada una cadena de caracteres, encuentre
el número máximo de caracteres que separan dos caracteres iguales
(entre dichos caracteres no puede aparecer otro igual). Por ejemplo,
dada la siguiente cadena:
A
B
C
A
B
E
F
G
A
la función deberı́a devolver 5 (¡ojo! la respuesta NO es 8). Calcula la
complejidad asintótica para el caso peor.
9.
Dada la siguiente función, indica una talla que describa el tamaño del
problema, y aporta las cotas asintóticas del coste de la función en los
casos peor y mejor.
int Factores2(int n) {
int i;
i=0;
while (n%2 == 0) {
n=n/2;
i++;
}
return i;
}
10.
Calcula el coste computacional del siguiente segmento de código:
if (A[1][1]==0)
for (i=0;i<n;i++)
for (j=0;j<n;j++)
A[i][j]=0;
else
4
for (i=0;i<n;i++)
A[i][i]=1;
11.
Dado el siguiente segmento de código:
for (i=0;i<n-1;i++) {
small=i;
for (j=i+1;j<n;j++)
if (A[j]<A[small]) small=j;
temp=A[small];
A[small]=A[i];
A[i]=temp;
}
¿qué hace sobre el vector de enteros A? Calcula el coste computacional
del algoritmo.
12.
Calcula el coste asintótico de los siguientes algoritmos que imprimen
una cadena al revés (Nota: ten en cuenta el coste de strlen):
a) N = strlen(word);
for (i = 0; i < N; i++)
printf("%c", word[N-i-1]);
b) for (i = 0; i < strlen(word); i++)
printf("%c", word[strlen(word)-i-1]);
13.
Dado un vector de N números reales, encuentra el par de elementos que
tienen el valor más alejado entre sı́. Impleméntalo con un algoritmo de
coste lineal.
5
14.
Dada la siguiente función:
func(int n) {
int limite, j, k;
limite=1;
j=1;
while (j<=n) {
k=1;
while (k<=limite) {
k++;
printf("k incrementado a %d\n",k);
}
j++;
limite=limite+limite;
printf("j incrementado a %d\n",j);
}
}
a)
¿Cuántas veces se comprueba la condición del primer while si n
vale 1?
b)
¿Cuántas veces escribe la función “j incrementado a...” si n
vale 5?
c)
¿Cuántas veces se comprueba la condición del primer while, en
función de n?
d)
¿Cuántas veces escribe la función “k incrementado a ...” para
n igual a 2?
e)
¿Cuántas veces se comprueba la condición del segundo while si
n vale 5?
f)
¿ Cuál es el valor máximo que toma la variable k durante la
ejecución de func(5);?
g)
¿Cuántas veces escribe la función “k incrementado a...”, en
función de n?
6
Descargar