Tema 1
Tema 1
L operaciones aritméticas
, return , Llamada Función
acceso a
arrays
, a
Eficiencia
Enfoque teórico (A priori) : Calcula una función en Función del tamaño de la entrada su naturaleza
y
Cota Superior
+ 0
ge0(f) si g(ulcF(n)
fe0(g) =
) 0(f) = 0(g)
O(f) = O(g)(t) feo(g) ygE0(F)
⑦ pag 18 el ejemplo
Para índice = expresión , to expresión By expresión Do cuerpo
f, ff(g) y fztf(h) ) f , + fz
=
&(g) y f ,
+ fz O(h)
Lenguajes y Ciencias
de la Computación
E.T.S.I. Informática
1
¿Qué vamos a hacer? - Guia
“Estudiar como se estudia” la complejidad de los
algoritmos.
¿Cómo?
Ejemplos y problemas
Algoritmia elemental.
Notación asintótica.
Ecuaciones de recurrencia.
Clases de complejidad
Algoritmia Elemental
Recursos que requiere un algoritmo.
E/S
ALGORITMO
Una ó más Una ó más
entradas salidas
Algoritmia Elemental
Diferentes algoritmos para un mismo problema. ¿Cual utilizar?
Factores: facilidad de programación, claridad, robustez, .... , y por
supuesto la eficiencia: recursos consumidos para obtener la solución.
vs
Teórico Empírico
Algoritmia Elemental
Para un problema de tamaño 20
Algoritmia frente a hardware. el algoritmo tardaría 10-4220
104.85 (cerca de 2 minutos).
Velocidad equipo
Velocidad algoritmo
¿g ∈ 𝑂 𝑓 ?
No
Notación Asintótica
Ejemplo. Comprobar que t(n) = 3n2 + 2n –5 es de orden de O(n2).
Para ello tenemos que comprobar que 3n2 + 2n –5 c n2 .
Solución. 3n2 + 2n –5 5 n2. Entonces diremos que t(n) es de O(n2).
Gráficamente.
¿t(n) ∈ 𝑂 𝑛 ?
Notación Asintótica
Propiedades de O.
l
1
2
mi
Ejemplo: for (i=1;i<=n;i++) printf(“%d”,i);
Respuesta: t(for)=1+(1+2+1)*(((n-1)/1)+1)=1+4*n
t n t procedure 1
𝑡 𝑛 =𝑡 𝑛−1 +1
Notación Asintótica
Cota Inferior. Notación .
Tiene sentido en el análisis del mejor caso
Es la cota que determina acotaciones inferiores lo más exactamente
posibles para valores crecientes de la entrada.
Definición. Sea f: [0,), se define el conjunto de funciones de
orden de f como:
(f) ={g: [0,) / c, c > 0, n0, de manera que,
g(n) cf(n) n n0}
Diremos que una función g: [0,) es de orden de f si g (f).
g (f) indica que g está acotada inferiormente por algún
múltiplo de f.
Notación Asintótica
Propiedades de . f ( n) n 3 ; g ( n) n 2 ; h( n) n
l R l
if (i<a.length) return i;
else return -1;
J
l
}
}
1 + (y + 2)n + 2+ 2 + 4
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
6 2 8 3 5 7 9 0 1 4 6 2 8 3 5 7 9 0 1 4
6 14
¿Exáctamente? Peor caso
public class BusqSecuencial {
/**
* Búsqueda secuencial en un array de enteros
* @param a : array de elementos en el que buscar
* @param x : elemento buscado
* @return la posición del elemento en el array,
* si está, ó -1, si el elemento no está
*/
public static int busqSec(int[] a,int x){
19 int i = 0; 1
expresión
while (i<a.length && a[i]!=x){
i++; cuerpo
}
if (i<a.length) return i;
else return -1;
p?
}}
To
sexprtcuerpo
𝑇 𝑛 = 1 + 5 + 2 𝑛 + 2 + 1 = 7𝑛 + 4
Análisis de algoritmos no recursivos:
Ordenación por inserción
0 1 2 3 4 5 6
/** 6 2 8 3 5 7 9
*
* @param a array de enteros a
* ordenar por insercion 0 1 2 3 4 5 6
*/ 2 6 8 3 5 7 9
public static void insercion(int[] a){
for (int i = 1; i<a.length; i++){ 0 1 2 3 4 5 6
// a[0..i-1] está ordenado
int j = i-1; 2 6 8 3 5 7 9
int x = a[i];
// insertamos a[i] en a[0..i-1] 0 1 2 3 4 5 6
// para que a[0..i] quede ordenado
2 3 6 8 5 7 9
while (j>=0 && a[j]>x) {
a[j+1]= a[j];
j--; 0 1 2 3 4 5 6
}
2 3 5 6 8 7 9
a[j+1]=x;
}
} 0 1 2 3 4 5 6
2 3 5 6 7 8 9
0 1 2 3 4 5 6
2 3 5 6 7 8 9
Análisis de algoritmos no recursivos:
Ordenación por inserción
Tamaño de la entrada: longitud del array a ordenar n.
Caso mejor: el array está ordenado
El cuerpo del bucle anidado no se ejecuta nunca
/**
*
* @param a array de enteros a
* ordenar por insercion
*/
public static void insercion(int[] a){
1 "
for (int i = 1; i<a.length; i++){ +(ul t(expr ,(+
1
} M 1 t(n) 1 + 9n + 8n2
=
a[j+1]=x;
}
}
t n n
Análisis de algoritmos no recursivos:
Ordenación por inserción
Caso peor: el array está
ordenado de forma decreciente
El cuerpo del bucle anidado se
ejecuta siempre
0 1 2 3 4 5 6
/** 9 8 7 5 3 2 0
*
* @param a array de enteros a
* ordenar por insercion
*/
public static void insercion(int[] a){
for (int i = 1; i<a.length; i++){
// a[0..i-1] está ordenado
int j = i-1;
int x = a[i];
// insertamos a[i] en a[0..i-1]
// para que a[0..i] quede ordenado
while (j>=0 && a[j]>x) {
a[j+1]= a[j];
j--;
}
}
}
a[j+1]=x;
t n n 2
Ordenación por inserción, peor caso. ¿Exactamente?
/** ? &
*
* @param a array de enteros a
* ordenar por insercion
8
𝑇 𝑛 =1+ (2 + 2 + 2 + 2 + 4 + 4 + 2 + 3) =
*/
public static void insercion(int[] a){
1 1
for (int i = 1; i<a.length; i++){
2
1+ 11 + 10 =
// a[0..i-1] está ordenado 10(i -
1)
int j = i-1;
1 1
-10?
int x = a[i];
1+ 11 + 10i = 1+ 11(n−1)+10 𝑖 =
-
&
a[j+1]=x;
}
}
1 1 1
1
1 1 1
1 1
1
t(n 11 + 1
t(u)
-
t (u) = t(u - 11 + 1
+ v, 0, 15)
.
1
5
S 4 .
2 .
15/2 0
8
medio = + =
33 .
. 5 .
5 .
7 7 .
v[7] == 7 ! No 345 -+
+ 2
7
+ 2
! No 07 13 ? No
7 ==0
= =
(v , 8 , 15)
(v, 0
, 7) medio =
(15-8)/2 + 8 =
Dis
-
VIll] =: 11 ? No
↓ -
11 = 8 ? 011 == 15 ? No
=
3 == 0 ? 0 3 = = 7 ? No -
v[9] = = 9 ? No
-
v213] = = 13 ? No
13 = = 127813 :: 15
(v, 4 7) 8 ? 09 : : /1 ? No ?
C = = No
(v , 0 , 3)
-
, (v , 12 , 13) (r , 14 , 19
medio ( , 8 9) (v , 10, 11) (
medio = 312 =
DS S ,
=
medio = 12 medio : 14
-
v(5) = = 5 ? No
medio
v[1] =: 1 ? No 5 = =
4485 = = 7 ? No
= s medio = 10
1 = = 0 ? 0 1 =: 3 ? No (v , 4 5)
-
vi8] == 8 ? do VE10) =: 10
? No
, (v , 6 , 7)
8= 8! Si 10 = 10 ?
medio. y medio 6 Si
(v , 0, 11 (v , 2 , 3) -
V[4] =: < ? No
=
i -
=
i -
=
-
VI6] =: 6 ? No
medio = 2-4
= :4 : Si 6 : Si
6
medio = o
-
=:
i =
- 1 i =
= 1
-
v[0] = = 0 ? No
-
v[2] = = 2 ? No
2 == 2 ? Si
0? Si
-
-
0= =
i =
=
1 i =-
Y
m
21 ,,, 3 Os) ,
medio =
(j -i)/2 + i
zie edio
O
expected :
zig] >
-
v[2] 2 ? Si
reos o
= =
O 1
[1 1) ,
medio =
v[1] = = 1 ? Si
[1]
medio = O
no coincide =j
Análisis de algoritmos no recursivos:
Ordenación por selección
0 1 2 3 4 5 6
/** 6 2 8 3 5 9 7
* @param a array de enteros
* a ordenar por selección
*/ 0 1 2 3 4 5 6
public static void seleccion(int[] a){ 2 6 8 3 5 9 7
for (int i = 0; i<a.length-1; i++){
// a[0..i-1] está ordenado
int min = i; 0 1 2 3 4 5 6
for (int j=i+1;j<a.length;j++) { 2 3 8 6 5 9 7
// min es el menor elemento
// del array a[i..j-1]
if (a[j]< a[min]) min = j; 0 1 2 3 4 5 6
} 2 3 5 6 8 9 7
//intercambiamos a[i] y a[min]
int temp = a[i];
a[i] = a[min]; 0 1 2 3 4 5 6
a[min] = temp; 2 3 5 6 8 9 7
}
}
0 1 2 3 4 5 6
2 3 5 6 7 9 8
0 1 2 3 4 5 6
2 3 5 6 7 8 9
Análisis de algoritmos no recursivos:
Ordenación por selección
/**
* @param a array de enteros
* a ordenar por selección
*/
public static void seleccion(int[] a){
for (int i = 0; i<a.length-1; i++){
// a[0..i-1] está ordenado
int min = i; ¿Orden?
for (int j=i+1;j<a.length;j++) {
2
// min es el menor elemento
// del array a[i..j-1]
t(n) Î Q(n )
if (a[j]< a[min]) min = j;
}
//intercambiamos a[i] y a[min]
int temp = a[i];
a[i] = a[min];
a[min] = temp;
}
}
Ejemplo 1
//@ pre: n>=0
public static void misterio (int n) { n
n n 1 2n 1
int s = 0;
HOME
i2
i 1 6
int i, j, k;
for ( i = 1; i <= n-1; i++ )
n 1
n n 1 2n 1
for ( j = i+1; j <= n; j++ )
i2 6
i1
for ( k = 1; k <= j; k++ )
s += 2;
}
Mejor, peor caso?
public static void muyImpar (int n) {
Los distintos casos se int x = 0, y = 0;
estudian con respecto a la int i, j, k;
NATURALEZA, NO con for ( i = 1; i <= n; i++ ) {
respecto al tamaño. if (( i % 2 ) == 0 ) {
for ( j = 1; j <= n; j++ ) {
x++;
}
for ( k = 1; k <= i; k++ ) {
y++;
}
¿Orden? }
}
}
Mejor, peor caso? Caso medio?
public static void muyImpar (int n) {
Los distintos casos se int x = 0, y = 0;
estudian con respecto a la int i=n, j, k;
NATURALEZA, NO con if (( i % 2 ) == 0 ) {
respecto al tamaño. for ( j = 1; j <= n; j++ ) {
x++;
}
for ( k = 1; k <= i; k++ ) {
y++;
}
}
}
Ejemplo
/**
* @param n número natural
* @return n! = 1*...*n
*/
public static int factorial(int n){
if (n<0) throw
new IllegalArgumentException(“número no válido");
if (n == 0) return 1;
else return n*factorial(n-1);
}
Ecuaciones de Recurrencia
Ejm. t(n)=2t(n-1)+4n
Ejm. t(n)=2t(n/2)+n
Ecuaciones Homogéneas
Se trata de resolver ecuaciones de la forma:
x nk
a x
o
k
a1 x k 1
... a k 0
La ecuación característica tiene la forma:
ao x k a1 x k 1 ... a k 0
Raíces Reales Distintas
Solución.
k
t n ci ri n donde ri son las distintas
raíces (soluciones) a la
i 1
ecuación característica
𝑡 𝑛 = 6𝑡 𝑛 − 1 − 8𝑡 𝑛 − 2
t(0)=0 y t(1)=1
Ecuación Característica. 𝑥 − 6𝑥 + 8 = 0
Raíces: 𝑟 = 2; 𝑟 = 4
t(n) =
c ,
2 + cyh
n n
Solución: tn c1r1 c 2 r2 .
perteneen la
puede
no
Constantes: 𝑐 +𝑐 =0 𝑐 =− ;𝑐 = a
2𝑐 + 4𝑐 = 1 tul
copuede sere
a
estofueranes dice
el
si
me
si me he equivocado en
V algo
𝑡 =− 2 + 4 ¿Orden?
Raíces Reales Distintas
t n t n1 t n2 , n 2
t 0 0, t1 1
Solución al Ejercicio
Solución al Ejercicio
/** /**
* @param n número natural * @param n número natural
* @return el n-ésimo elemento de fibonacci * @return el n-ésimo elemento de fibonacci
* Implementación ineficiente * Implementación eficiente
*/ */
public static int fibonacci(int n){ public static int fibonacciNoRec(int n){
//n >=0 if (n==0) return 0;
if (n==0) return 0; else {
if (n==1) return 1; int fibAnt = 0;
else return fibonacci(n-1)+fibonacci(n-2); int fibAct = 1;
} for (int i = 1; i<n; i++){
int fibInt = fibAnt;
fibAnt = fibAct;
fibAct = fibInt + fibAnt;
}
5 return fibAct;
4 3 }
}
3 2 2 1
2 1 1 0 1 0
i t(n) = C ,. 2 + (2 3+ Cz
. . n . zu
i 1 j 0
2 ì x1 = 1 con multiplicidad 1
x - 5x + 8x - 4 = 0 ↵ ( x - 1) ( x - 2) = 0 ↵ í
3 2
î x2 = 2 con multiplicidad 2
Solución:
t n C1 1 C 2 2 C3 n2 .
n n n
Constantes:
C1 C2 0,
1
C1 2C2 2C3 1, C1 2, C2 2, C3
C 4C 8C 2, 2
1 2 3
n 1 n 1
Solución final: tn 2 n2 2
Ecuaciones No Homogéneas
Son de la forma:
(X 2)(X 5)(x 1)
i 0 i 1 = 0
-
- -
Ecuación Característica:
k s
d i 1
ai x x bi 0 con d i el grado del polinomio p i (n)
k i
i 0 i 1
Y a continuación se procede de la misma forma que con las ecuaciones homogéneas
Ecuaciones no Homogéneas
Ejemplo: k s
i
a t n i i pi n,
b n
𝑡(𝑛) = 2𝑡(𝑛 − 1) + 𝑛 + 2 ; i 0 i 1
𝑡 𝑛 − 2𝑡 𝑛 − 1 = 𝑏 𝑝 𝑛 + 𝑏 𝑝 𝑛 ;
𝑡 𝑛 − 2𝑡 𝑛 − 1 = 1 𝑛 + 2 1;
Ec. caract (x − 2) 𝑥 − 1 𝑥−2 =0
t (n) C1 2 C2 n2 C3 C4 n
n n
k k i d i 1
s
ai x x bi 0 con d i el grado del polinomio p i (n)
i 0 i 1
Notas adicionales
¿Como se hace el caso en el que las raices sean
complejas de multiplicidad 1?
Exactamente igual que en el caso de raices reales de multiplicidad
1
Con las reducciones posibles cuando se estén tratando con
números imaginarios (ejm. i*i=-1).
No vamos a ver el caso en el que las raices sean
complejas de multiplicidad mayor que 1.
Las raices de la ecuación característica de una ecuación
de recurrencia no pueden ser 0.
Tipos de ecuaciones de recurrencias
Lineales
1. Homogéneas
2. No-homogéneas
No lineales
3 : 3=
Solución. Realizar un cambio de variable.
e3/z
=
Cambio de variable. n 3k
t 3k 4t 3k 1 9k
L t k 4t k 1 9 k
cambio de dominio
Ecuación conocida.
𝑡 =𝑐 4 +𝑐 9
-algs
lga
Deshacemos el cambio de variable: = C
𝑡 𝑛 =𝑐 4 +𝑐 9 =𝑐 𝑛 +𝑐 𝑛
Cambio de Rango
Son de la forma: mirar en casa !
1
t n nt n 2, t 1
2
3
Solución. En este caso se toman logaritmos log na = a .
logn
𝑣 = log 𝑡
Cambio de Rango. Tomamos logaritmos en ambos lados y renombramos:
𝑣 = 𝑘 + 2𝑣
Ecuación conocida.
𝐸𝑐 → 𝑥 − 2 𝑥 − 1 =0
Cambio de Rango
1
t n nt n 2, t 1
2
𝑡 =2 + t 2 = 2𝑡 1 =
𝑡(𝑛) = 2 + t 4 = 2𝑡 2 =
1
=2
3
2/9 = 2
8/81 = 2
⑨
Análisis de algoritmos recursivos
El teorema maestro (versión general)
Análisis de algoritmos recursivos
El teorema maestro (ejemplos)
a b f(u) ,
log = Z
E
Análisis de algoritmos recursivos
El teorema maestro (versión reducida)
/**
* @param l lista de números a sumar
* @param min y max, índices máximo y mínimo a suma
* @return Suma de los elementos de la lista
* Implmentación recursiva
*/
public static int suma(List<Integer> l,int min,int max){
if (max < min) return 0;
if (max == min) return l.get(min);
else {
int s1 = suma(l, min,(min+max)/2);
int s2 = suma(l, (min+max)/2+1,max);
return s1+s2;
}
}
Análisis de algoritmos recursivos
Búsqueda binaria
izda medio dcha
/**
* @param a array en el que se busca x = 4
* suponemos que está ordenado
0 1 2 3 4 5 6 7
* @param x elemento buscado
* @return posición en la que aparece x, si 2 3 5 6 7 8 8 9
* está, o -1, si no está izda medio dcha
*/
public static int busqBinaria(int[] a,int x){ 0 1 2 3 4 5 6 7
int izda = 0,dcha = a.length-1; 2 3 5 6 7 8 8 9
int medio = (izda + dcha)/2;
while (izda <= dcha && a[medio]!=x){
if (a[medio]>x) dcha = medio - 1;
izda medio
dcha
else izda = medio + 1;
0 1 2 3 4 5 6 7
medio = (izda + dcha)/2;
} 2 3 5 6 7 8 8 9
if (izda <= dcha) return medio;
else return -1;
}
Límites:
Definición. Se dice que la función f(n) tiende al límite a cuando n
tiende a infinito, si para todo número real positivo δ,
independientemente de lo pequeño que sea, f(n) dista de a en
una cantidad menor que δ para todos los valores de n
suficientemente grandes.
Límites:
Proposición. Cuando f(n) no tiende a un límite, ni tampoco a +
o -, diremos que f(n) oscila cuando n tiende a infinito. Si es
posible encontrar una constante k tal que –k < f(n) < k para
todos los valores de n, diremos que f(n) oscila de forma finita, en
caso contrario, f(n) oscila de forma infinita. P.e. (-1)n y (-1)n n.
Límites:
Proposición. Si dos funciones f(n) y g(n) tienden respectivamente
a los límites a y b cuando n tiende a infinito, entonces f(n) g(n)
tiende al límite a b.
Series:
Proposición. (Serie aritmética) Sea Sn la suma de los n primeros términos
de la serie aritmética a, a + d, a + 2d, … . Entonces:
n n 1 d
Sn a n
2
Proposición. (Serie geométrica) Sea Sn la suma de los n primeros
términos de la serie geométrica a, ar, ar2, … (caso especial: Si r = 1,
entonces Sn = an). Entonces:
a 1 r n
Sn
1 r
Nociones Básicas de Matemáticas
Series:
Proposición. Para cualquier entero k 0 tenemos que:
n
n n 1n k 1
i i 1i k
i 1 k 2
n
n n 1
i 1
i
2
Nociones Básicas de Matemáticas
Series:
Proposición.
n
n n 1 2n 1
i 1
i 2
6
Sea r cualquier entero positivo. Entonces
n r 1
n
i1
i r
r 1
pr n
mirar
pag 28 yo
11 11
32
pag
Ecuaciones homogéneas
t(n) = St(n-1) -
8t(n -
2)
e t(ul=isoluciones de la ec.
4x >
- r =2
0x + 8 =
04rz
-
= 4
En = c
, r + cyr
c 0
&
+
, cz =
C
-=
=
=
2c + 4c = 1
tr =
-
12 +
Lu
draices No distintas?
En nor
tn = 5tn-1-8tn-z + 4tn 3
-
x = 1
,
x2 = 2 e multiplicidad 2
tu = c, (1)" + ((2)" +
Cn(2)"
C,
&
+ C2 = 0
c. + 2 +
24 = 1 = c , = -
2(2 = 2 (= -
C, + u(z + 8Cz = 2
+ +
tn = 2V -
nzn -
2
Rag 49
② pag 53