Beruflich Dokumente
Kultur Dokumente
Posibles respuestas:
Ejemplo:
2
¿Cómo podemos realizar el estudio de la eficiencia de un
algoritmo?
3
Ejemplo: el problema del viajante de comercio.
4
La entrada de un problema y su tamaño.
5
2. El tiempo de ejecución de un algoritmo y su orden
de eficiencia.
T(n)
Unidades de tiempo (segundos, milisegundos,...) que un
algoritmo tardaría en ejecutarse con unos datos de entrada
de tamaño n.
Pero...
... tiempo de ejecución depende
Entonces...
...T(n) representará
O de manera equivalente,
6
Principio de invarianza:
7
Tiempos de ejecución en diferentes situaciones:
8
Ejemplo 1:
Ejemplo 2:
9
¿Cómo se calcula el tiempo de ejecución de un algoritmo?
constante
10
• Tiempo de ejecución (secuencia de instrucciones) =
11
Ejemplo: fución para calcular el valor mínimo de un vector.
12
Eficiencia
13
Ejemplo:
¡OJO!
más importante la forma de las funciones (n y n2),
que las constantes (2 y 100).
14
Las funciones que nos marcan más comúnmente el orden
de crecimiento de los algoritmos y los nombres por las que
se les conocen son las siguientes:
15
• Algoritmo eficiente: como mucho un coste
quasilineal.
16
Crecimiento de algunas funciones conforme crece el tamaño
n del problema:
log n n nlog n n2 n3 2n
3 10 33 100 1.000 1.024
7 100 664 10.000 1.000.000 1'267650600228e+30
0 1.000 9.966 1.000.000 1.000.000.00 1'07150860718e+301
0
3 10.000 132.877 100.000.000 1'0e+12 Enorme
7 100.000 1.660.964 10.000.000.000 1'0e+15 Más enorme
10 1.000.000 19.931.569 1.000.000.000.000 1'0e+18 Sin comentarios
17
Los órdenes de eficiencia son clases de equivalencia
(basadas en el principio de invarianza):
Ejemplo:
18
3. Las notaciones asintóticas.
19
La notación asintótica del orden generalizada a dos
parámetros es la siguiente: sea f:N x N→R+∪{0} una función
cualquiera, el conjunto de las funciones del orden de f(n,
m), notado como O(f(n, m)), se define como sigue:
[Invarianza multiplicativa].
• ∀c ∈ R+, g ∈ O(f) si y sólo si c·g ∈ O(f)
[Invarizanza aditiva]
• ∀c ∈ R+, g ∈ O(f) si y sólo si c+g ∈ O(f)
[Reflexividad]
• f ∈ O(f)
[Transitividad]
• Si h ∈ O(g) y g ∈ O(f) entonces h ∈ O(f)
[Criterio de Caracterización].
• g ∈ O(f) si y sólo si O(g) ⊆ O(f)
20
[Regla de la suma]
• Si g ∈ O(f) y h ∈ O(f'), entonces g + h ∈ O(max(f, f'))
Demostración:
Ejemplo:
O(n2),
O(n3)
O(nlgn)
21
[Regla del producto].
Demostración:
Ejemplo:
O(n)
O(lg n)
O(nlgn).
22
La notación o minúscula es también una cota superior:
23
Las notaciones Ω
Las notaciones Θ.
24
Relaciones entre las diferentes notaciones.
25
4. Cálculo del tiempo de ejecución de un algoritmo
iterativo y de su orden de eficiencia.
Sentencias simples.
26
/*1*/ public void main()
/*2*/ {
/*3*/ int a, b, c;
/*4*/ System.out.println("Introduzca los dos números a
sumar: ");
/*5*/ a= Console.in.readInt();
b= Console.in.readInt();
/*6*/ c= a+b;
/*7*/ System.out.println("La suma de”+a+”y”+b+”es “+c);
/*8*/ }
2) T(n)= te+tl+toa+te= c,
T(n)=c ∈ O(1).
27
Sentencias de repetición.
28
* Bucles controlados por centinela.
/*1*/ i=0;
/*2*/ while (i<n && vector[i] != valor)
/*3*/ i++;
Sentencias condicionales.
29
/*1*/ if (n> m)
/*2*/ n= n *m;
/*3*/ else
/*4*/ for (i=0; i<n;i++)
/*5*/ m= m * n;
30
Llamadas a funciones no recursivas.
31
Ejemplos
−
−
− = = − ∈ O(n2).
=
32
public long SumaSubsecuenciaMaxima(int vector[], int n)
{
int i, j, k;
/*1*/ int sumMax=0, posInicioSec=0,
posFinSec=0, sumaActual;
/*2*/ for (i=0;i<n; i++)
/*3*/ for (j=i;j<n; j++)
/*4*/ {
/*5*/ sumaActual=0;
/*6*/ for (k=i;k<j; i++)
/*7*/ sumaActual+= vector[k];
/*8*/ if (sumaAcutal > sumaMax)
/*9*/ {
/*10*/ sumaMax= sumaActual;
/*11*/ posInicioSec= i;
/*12*/ posFinSec= j;
/*13*/ }
/*14*/ }
/*15*/ return sumMax;
}
33
El tiempo de ejecución de la función vendrá dada por:
= ,
= = =
− + − +
Segunda sumatoria: − + = ,
=
− + − +
= − + + + + =
= = = =
+ + + + + + +
= − + + = ∈
34
5. Cálculo del tiempo de ejecución de algoritmos
recursivos y de su orden de eficiencia.
35
public void OrdenarVector (int vector[], int n)
{
int i, maxPos;
if (n>1)
{
maxPos=0;
for (i=1; i<n;i++)
if (vector[i] > vector[maxPos])
maxPos= i;
if (maxPos != 0)
{
i= vector[0];
vector[0]= vector[maxPos];
vector[maxPos]= i;
}
OrdenarVector(vector, n-1);
}
}
Ecuación de recurrencia:
Si n ≤ 1, T(1)=1, si no, T(n) = T(n-1) + n.
y en general:
−
= − + − ≥ + .
=
−
Para i=n-1, = + −
=
−
+
= + + + = − = ∈
=
36
6. Resolución de recurrencias homogéneas.
37
=
= =
− + − ≥
c1 + c2 = 0 y -c1 + 4c2 =1
38
Dada la recurrencia:
Soluciones a la ecuación:
c1 + c2 = 0 y c1r1 + c2r2 = 1.
Al solucionarlo,
c1=1/(51/2) y c2=-1/(51/2).
T(n) ∈ O((1/(51/2))n)
39
Dada la recurrencia:
x3 - 5x2+ 8x - 4= 0
• 1, con multiplicidad 1, y
• 2, con multiplicidad 2,
• es decir, (x-1)(x-2)2 =0.
Las recurrencias:
a0tn + a1tn-1 +...+ aktn-k = bnp(n) [3]
41
Dada la recurrencia:
(x2 -x-1)(x-1)=0
tn - 2tn-1 = 3n
(x-2)(x-3)=0
tn - 2tn-1= (n+5)3n
(x-2)(x-3)2=0
42
La recurrencia T(n) = 2T(n-1) + n, n ≥1 y T(0) = 0.
tn - 2tn-1 = n
(x-2)(x-1)2 = 0
43
De esta misma manera, se pueden resolver recurrencias de
la forma:
Dada la recurrencia:
(x-2)(x-1)2(x-1)2 = 0
44
Su solución tiene la forma:
45
8. Resolución de recurrencias mediante cambio de
variable.
+ ≥
=
=
y en general:
T(2m)= T(2m-i)+i, m ≥ i
T(2m)= T(20) + m = m + 1
46
Un segundo ejemplo donde n es una potencia de 2,
corresponde a la resolución de la recurrencia:
T(n)= 4T(n/2) + n2
O lo que es lo mismo:
tm= 4tm-1 + 4m
(x-4)2=0
47