Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
LA EFICIENCIA DE
LOS ALGORITMOS
UNIVERSIDAD DE ALICANTE
1
La eficiencia de los algoritmos
CONTENIDO
1. Noción de complejidad
2. Cotas de complejidad
3. Análisis asintótico
4. Cálculo de complejidades
Algoritmos Iterativos
Algoritmos Recursivos. Ecuaciones de recurrencia
5. Anexo
1. Noción de complejidad
¿QUÉ ES UN ALGORITMO?
2
1. Noción de complejidad
DEFINICIÓN
Complejidad de un algoritmo
Medida de los recursos que un algoritmo necesita para su
ejecución
Complejidad temporal: Tiempo que un algoritmo necesita para su
ejecución
Complejidad espacial: Recursos espaciales (de almacén) que un
algoritmo consume o necesita para su ejecución
Posibilidad de hacer
Valoraciones: el algoritmo A es “bueno”, “el mejor”, “prohibitivo”
Comparaciones: el algoritmo A es mejor que el B
Nos centraremos en el estudio de la complejidad temporal
1. Noción de complejidad
COMPLEJIDAD TEMPORAL
3
1. Noción de complejidad
¿CÓMO ESTUDIAMOS EL TIEMPO DE EJECUCIÓN?
1. Noción de complejidad
¿CÓMO ESTUDIAMOS EL TIEMPO DE EJECUCIÓN?
4
1. Noción de complejidad
¿CÓMO ESTUDIAMOS EL TIEMPO DE EJECUCIÓN?
∃c ∈ \ + , ∃n0 ∈ ` / ∀n ≥ n0 T1 ( n) ≤ c·T2 ( n)
1. Noción de complejidad
¿CÓMO ESTUDIAMOS EL TIEMPO DE EJECUCIÓN?
10
5
1. Noción de complejidad
CONSIDERACIONES
11
1. Noción de complejidad
CONSIDERACIONES
6
1. Noción de complejidad
CONSIDERACIONES
f (n) = 4n + 4
devuelve(m); // 1 //
fin /* 4n+4 */
1. Noción de complejidad
CONSIDERACIONES
70
60 f(n)=2
50 f(n)=4n+4
tiempo
40
30
20
10
0
1 5 10 15
tamaño problema 14
7
1. Noción de complejidad
CONSIDERACIONES
¿Cuál es la diferencia?
15
1. Noción de complejidad
CÁLCULO DEL NÚMERO DE PASOS DE PROGRAMA
T = T (C ) + ( n º iteraciones ) * (T ( S ) + T (C ))
donde T(C) y T(S) pueden variar en cada iteración, y por tanto habrá que
tenerlo en cuenta para su cálculo.
El resto de sentencias iterativas se asemeja al bucle MIENTRAS
16
8
1. Noción de complejidad
CÁLCULO DEL NÚMERO DE PASOS DE PROGRAMA
T = 1 + T ( P1 ) + T ( P2 ) + ... + T ( Pn ) + T ( F )
El paso de parámetros por referencia, por tratarse simplemente de punteros,
no contabiliza
El tiempo de ejecución de las llamadas a procedimientos recursivos va a dar
lugar a ecuaciones en recurrencia, que veremos posteriormente.
17
1. Noción de complejidad
EJERCICIOS
n=n+1;
devuelve(n);
fin
18
9
1. Noción de complejidad
EJERCICIOS
j = 2;
para i = 1 hasta 2000
j=j*j;
fpara;
i = 0;
mientras (i ≤ n)
j = j + j;
j = j - 2;
i = i + 1;
fmientras;
devuelve(j);
fin
19
1. Noción de complejidad
EJERCICIOS
10
1. Noción de complejidad
EJERCICIOS
21
1. Noción de complejidad
EJERCICIOS
22
11
2. Cotas de complejidad
INTRODUCCION
23
2. Cotas de complejidad
EL PROBLEMA
24
12
2. Cotas de complejidad
LA SOLUCIÓN: Cotas de complejidad
25
2. Cotas de complejidad
EJEMPLO: Cotas superior e inferior
26
13
2. Cotas de complejidad
EJEMPLO: Cotas superior e inferior
3. Análisis asintótico
INTRODUCCION
28
14
3. Análisis asintótico
NOTACION ASINTÓTICA
29
3. Análisis asintótico
COTA SUPERIOR. NOTACION O
≥0
Sea f : ` → \ se define el conjunto O(f) como el conjunto de
funciones acotadas superiormente por un múltiplo de f :
Ο( f ) = {g : ` → \ ≥0 | ∃c > 0, ∃n0 ∈ ` / ∀n ≥ n0 g( n ) ≤ c· f ( n )}
30
15
3. Análisis asintótico
COTA SUPERIOR. NOTACION O
≥0
Sea f : ` → \ se define el conjunto O(f) como el conjunto de
funciones acotadas superiormente por un múltiplo de f :
Ο( f ) = {g : ` → \ ≥0 | ∃c > 0, ∃n0 ∈ ` / ∀n ≥ n0 g( n ) ≤ c· f ( n )}
c· f (n)
t (n) Ejemplos:
3n + 1 ¿pertenece a O(n) ?
3n2 + 1 ¿pertenece a O(n) ?
3n2 + 1 ¿pertenece a O(n2)?
31
3. Análisis asintótico
NOTACION O : PROPIEDADES
¿ O(349n2) = O(2n2) ?
32
16
3. Análisis asintótico
NOTACION O : PROPIEDADES
33
3. Análisis asintótico
NOTACION O : MAS PROPIEDADES
4. f ∈ Ο ( g ) ∧ g ∈ Ο( h ) ⇒ f ∈ Ο ( h )
5. f ∈ Ο( g ) ∧ g ∈ Ο(h) ⇒ f ∈ Ο(min( g , h))
6. Regla de la suma: Si f1 ∈ Ο( g1 ) ∧ f 2 ∈ Ο( g 2 ) ⇒ f1 + f 2 ∈ Ο(max( g1 , g 2 ))
7. Regla del producto: Si f1 ∈ Ο ( g1 ) ∧ f 2 ∈ Ο( g 2 ) ⇒ f1 · f 2 ∈ Ο( g1 · g 2 )
f ( n)
8. lim = 0 ⇒ f ∈ Ο( g )
n →∞ g ( n)
9. f (n) = am ·n m + am-1 ·n m-1 + ... + a1 ·n + a0 ∈ Ο(n m )
10. Ο( f ) ⊂ Ο( g ) ⇔ f ∈ Ο( g ) ∧ g ∉ Ο( f )
34
17
3. Análisis asintótico
COTA INFERIOR. NOTACION Ω
≥0
Sea f : ` → \ se define el conjunto Ω(f) como el conjunto de
funciones acotadas inferiormente por un múltiplo de f :
Ω( f ) = { g : ` → \ ≥0 | ∃c > 0, ∃n0 ∈ ` / ∀n ≥ n0 g(n) ≥ c· f (n)}
35
3. Análisis asintótico
COTA INFERIOR. NOTACION Ω
≥0
Sea f : ` → \ se define el conjunto Ω(f) como el conjunto de
funciones acotadas inferiormente por un múltiplo de f :
Ω( f ) = { g : ` → \ ≥0 | ∃c > 0, ∃n0 ∈ ` / ∀n ≥ n0 g(n) ≥ c· f (n)}
t (n)
Ejemplos:
36
18
3. Análisis asintótico
NOTACION Ω : PROPIEDADES
37
3. Análisis asintótico
COTA PROMEDIO. NOTACION Θ
≥0
Sea f : ` → \ se define el conjunto Θ(f) como el conjunto de
funciones acotadas superior e inferiormente por un múltiplo de f :
O lo que es lo mismo: Θ( f ) = Ο( f ) ∩ Ω( f )
Dada una función t : ` → \ ≥0 se dice que t ∈ Θ( f ) si existen
múltiplos de f que son cota superior y cota inferior de t
38
19
3. Análisis asintótico
COTA PROMEDIO. NOTACION Θ
≥0
Sea f : ` → \ se define el conjunto Θ(f) como el conjunto de
funciones acotadas superior e inferiormente por un múltiplo de f :
O lo que es lo mismo: Θ( f ) = Ο( f ) ∩ Ω( f )
Dada una función t : ` → \ ≥0 se dice que t ∈ Θ( f ) si existen
múltiplos de f que son cota superior y cota inferior de t
d · f ( n)
t (n) Ejemplos:
39
3. Análisis asintótico
NOTACION Θ : PROPIEDADES
40
20
3. Análisis asintótico
JERARQUIA DE FUNCIONES
3. Análisis asintótico
JERARQUIA DE FUNCIONES
42
21
3. Análisis asintótico
EJERCICIOS
⎛ k ⎞
k
4. fi ( n) ∈ O( gi ( n))1..k ⇒ ∑ f i (n) ∈ O ⎜ max gi ( n) ⎟
i =1 ⎝ i =1 ⎠
k
⎛ k ⎞
5. fi (n) ∈ O( gi (n))1..k ⇒ ∑ fi ( n) ∈ O ⎜ ∑ gi (n) ⎟
i =1 ⎝ i =1 ⎠
6. O(lg a n) = O(lg b n) ∀a, b > 1
n
7. ∑i
i =1
k
∈ O(n k +1 )
43
4. Calculo de Complejidades
INTRODUCCION
44
22
4. Calculo de Complejidades
ALGORITMOS ITERATIVOS
45
4. Calculo de Complejidades
ALGORITMOS ITERATIVOS
46
23
4. Calculo de Complejidades
ALGORITMOS ITERATIVOS. EJERCICIOS
47
4. Calculo de Complejidades
ALGORITMOS ITERATIVOS. EJERCICIOS
repetir
m= (pri+ult)/2;
si v[m]>x entonces ult= m-1
si_no pri= m+1
fsi
hasta (pri>ult) ∨ v[m]=x;
si v[m]=x entonces devuelve m
si_no devuelve 0
fsi
fin
48
24
4. Calculo de Complejidades
ALGORITMOS ITERATIVOS. EJERCICIOS
función F1 (a,n:entero)
var i,j:natural fvar
para i=1 hasta n hacer
para j=i hasta 2 hacer (*decreciente*)
F2(a);
fpara F2 ∈ Θ(a2)
fpara
fin
4. Calculo de Complejidades
ALGORITMOS ITERATIVOS. EJERCICIOS
50
25
4. Calculo de Complejidades
ALGORITMOS ITERATIVOS. EJERCICIOS
51
4. Calculo de Complejidades
ALGORITMOS ITERATIVOS. EJERCICIOS
52
26
4. Calculo de Complejidades
ALGORITMOS ITERATIVOS. EJERCICIOS
4. Calculo de Complejidades
ALGORITMOS RECURSIVOS
⎧Θ(1) n ≤1
f ( n) = ⎨
⎩Θ(1) + f (n − 1) n > 1
54
27
4. Calculo de Complejidades
ALGORITMOS RECURSIVOS
• a∈` constante
• P(n), P '(n) Funciones de n. No tienen por que ser polinomios
⎧n - b
• F (n ) < n Función estrictamente decreciente con n. Normalmente ⎨ b∈`
⎩n / b
55
4. Calculo de Complejidades
ALGORITMOS RECURSIVOS
56
28
4. Calculo de Complejidades
ALGORITMOS RECURSIVOS
1. Obtener talla (n) del algoritmo (n=i – Num. de elementos del vector)
2. Obtener ecuación de recurrencia a partir del algoritmo
4. Calculo de Complejidades
ALGORITMOS RECURSIVOS
= n + ( n − 1) + f (n − 2) = (2ª rec)
n −2 n −2
(n − 2)(n − 1)
⇒ f ( n) ∈ Θ( n 2 )
= ∑ (n) − ∑ ( j ) + f (1) = n( n − 1) − +1
j =0 j =0 2
58
29
4. Calculo de Complejidades
ALGORITMOS RECURSIVOS
QUICKSORT
Elemento pivote: Nos sirve para dividir en dos partes el vector
Al azar
Primer elemento → Quicksort primer elemento
Elemento central → Quicksort central
Elemento mediana → Quicksort mediana
Pasos:
Elección del pivote
Se hacen dos recorridos del vector: ascendente (i) y descendente (j)
El vector queda dividido en dos partes:
parte izquierda del pivote → elementos menores
parte derecha del pivote → elementos mayores
Se hacen dos llamadas recursivas. Una con cada parte del vector.
59
4. Calculo de Complejidades
ALGORITMOS RECURSIVOS
si pi<pf entonces
x=a[pi]; i=pi+1; j=pf;
repetir
mientras a[i]<x hacer i=i+1 fmientras
mientras a[j]>x hacer j=j-1 fmientras
si i≤j entonces
SWAP(a[i],a[j]); i=i+1; j=j-1;
fsi
hasta i>j;
SWAP(a[pi],a[j]);
QUICKSORT_CENTINELA (a,pi,j-1);
QUICKSORT_CENTINELA (a,j+1,pf);
fsi
fin
60
30
4. Calculo de Complejidades
ALGORITMOS RECURSIVOS
QUICKSORT
Tamaño del problema: n
Mejor caso: subproblemas (n/2, n /2)
⎧ Θ(1) n ≤1
⎪
f (n ) = ⎨ ⎛n⎞ ⎛n⎞
⎪ Θ( n ) + f ⎜⎝ 2 ⎟⎠ + f ⎜⎝ 2 ⎟⎠ n > 1
⎩
Peor caso: subproblemas (0, n -1),(n -1,0)
⎧ Θ(1) n ≤1
f (n) = ⎨
⎩ Θ( n ) + f ( 0 ) + f ( n − 1) n > 1
61
4. Calculo de Complejidades
ALGORITMOS RECURSIVOS
QUICKSORT
Resolución recurrencia mejor caso
f ( n) = n + 2 f ( n ) = (1ª rec)
2
(2 4 )
= n + 2 n + 2 f ( n ) = 2n + 4 f ( n ) =
4
(2ª rec)
4 ( 8 )
= 2n + 4 n + 2 f ( n ) = 3n + 8 f ( n ) = ... (3ª rec)
8
= in + 2i f ( n i ) (i-esima rec)
2
La recursión termina cuando (n/2 i)=1
Por tanto, habrá i=log2 n llamadas recursivas
f (n ) = in + 2i f ( n i ) =
2
= n log 2 n + nf (1) = n log 2 n + n ⇒ f (n ) ∈ Ω(n log 2 n )
62
31
4. Calculo de Complejidades
ALGORITMOS RECURSIVOS
QUICKSORT
Resolución recurrencia peor caso
f (n ) = n + f (n − 1) = (1ª rec)
= n + ( n − 1) + f (n − 2) = (2ª rec)
= n + ( n − 1) + (n − 2) + f (n − 3) = ... (3ª rec)
i −1
= ∑ (n − j ) + f (n − i ) (i-esima rec)
j =0
n −2 n −2
( n − 2)( n − 1) ⇒ f ( n ) ∈ Ο( n 2 )
= ∑ ( n ) − ∑ ( j ) + f (1) = n (n − 1) − +1
j =0 j =0 2 63
4. Calculo de Complejidades
ALGORITMOS RECURSIVOS
Coste QUICKSORT
8
7 1
8
6 1
4 4
2 2 2 2
5 1 Caso peor
1 1 1 1 1 1 1 1
4 1 Ο(n2)
Caso mejor 3 1
Ω(n lg2n) 2 1
1 1
64
32
4. Calculo de Complejidades
ALGORITMOS RECURSIVOS
65
4. Calculo de Complejidades
ALGORITMOS RECURSIVOS: EJERCICIOS
66
33
4. Calculo de Complejidades
ALGORITMOS RECURSIVOS: EJERCICIOS
67
4. Calculo de Complejidades
ALGORITMOS RECURSIVOS: EJERCICIOS
68
34
4. Calculo de Complejidades
ALGORITMOS RECURSIVOS: EJERCICIOS
69
5. Anexo
EXPRESIONES FRECUENTES
1. c ∈ Θ(1), ∀c ∈ \ ≥0 n
1
n
n
7. ∑ i ∈ Θ(lg n)
2. ∑ i = 2 (n + 1) ∈ Θ(n
i =1
2
) i =1
n
1
n
n 1
8. ∑r i
∈ Θ(1) si r > 1
3. ∑ i 2 = (n + 1)( n + ) ∈ Θ(n3 ) i =1
i =1 3 2 n
n
9. ∑ lg i ∈ Θ(n lg n)
4. ∑i
i =1
k
∈ Θ(n k +1
), ∀k ∈ ` i =1
n
10. ∑ i2 i −1
= n 2 n − 2 n + 1 ∈ Θ( n 2 n )
5. ∑ (n − i )
i =1
k
∈ Θ( n k +1 ), ∀k ∈ ` i =1
n
−1 r n +1
11. ∑ i2 −i
∈ Θ(1)
6. ∑ r i =
i =0
∈ Θ( r n ), r ≠ 1
i =0 r −1
70
35
5. Anexo
EXPRESIONES FRECUENTES
n
12. ∑ iri =1
i −1
∈ Θ(nr n ), ∀r > 1
n
13. ∑ iri =1
−i
∈ Θ(1), ∀r > 1
n
1
14. ∑ i ! ∈ Θ(1)
i =1
n
⎛n⎞
15. ∑ ⎜⎝ i ⎟⎠ = 2
i =1
n
∈ Θ(2n )
n
⎛n⎞
16. n !∈ Θ( n ⎜ ⎟ )
⎝e⎠
71
5. Anexo
SUMA DE SERIES
Donde:
progresión aritmética
a0 = Primer elemento de la serie
a + an
S n = n· 0 an = n-esimo elemento de la serie
2 S n = Suma de los n primeros elementos de la serie
72
36
5. Anexo
SUMA DE SERIES
progresión aritmético-geométrica
S n = 1r + 2r 2 + " + nr n
S n − rS n = r + r 2 + r 3 " + r n − nr n +1
(1 − r ) S n = r + r 2 + r 3 " + r n − nr n+1
n
73
5. Anexo
RECURRENCIAS FRECUENTES
a < 1 → Θ(1)
⎧b ' n ≤ n0
f ( n) ⎨ Solución: a = 1 → Θ(n)
⎩ a· f (n − c) + b n > n0 a > 1 → Θ( a n / c )
a < 1 → Θ( n )
⎧b ' n ≤ n0
f ( n) ⎨ Solución: a = 1 → Θ( n 2 )
⎩ a· f (n − c) + b·n n > n0 a > 1 → Θ( a n / c )
a < 1 → Θ( n k )
⎧b ' n ≤ n0
f ( n) ⎨ Solución: a = 1 → Θ(n k +1 )
⎩ a· f (n − c) + b·n n > n0
k
a > 1 → Θ( a n / c )
74
37
5. Anexo
RECURRENCIAS FRECUENTES
a < 1 → Θ(1)
⎧b ' n ≤ n0
f ( n) ⎨ Solución: a = 1 → Θ(lg n)
⎩a· f (n / c) + b n > n0 a > 1 → Θ(nlg a )
a < 1 → Θ ( n)
⎧b ' n ≤ n0
f ( n) ⎨ Solución: a = 1 → Θ(n lg n)
⎩a· f (n / c) + bn n > n0 a > 1 → Θ(nlg a )
a < c k → Θ( n k )
⎧b ' n ≤ n0
f ( n) ⎨ Solución: a = c k → Θ(n k lg n)
⎩ a· f (n / c ) + b·n n > n0
k
a > c k → Θ(n lg a )
75
5. Anexo
ALGORITMOS DE ORDENACION
Directos
Inserción directa
Inserción binaria
Selección directa
Intercambio directo (burbuja)
Avanzados
Mergesort
Quicksort
Heapsort
Shell
76
38
5. Anexo
ALGORITMOS DE ORDENACION
INSERCIÓN DIRECTA
77
5. Anexo
ALGORITMOS DE ORDENACION
INSERCIÓN BINARIA
78
39
5. Anexo
ALGORITMOS DE ORDENACION
SELECCIÓN DIRECTA
79
5. Anexo
ALGORITMOS DE ORDENACION
80
40
5. Anexo
ALGORITMOS DE ORDENACION
QUICKSORT central
81
41