COMPLEJIDAD COMPUTACIONAL
PRG-3
Complejidad computacional
´Indice
1 Introducci´on . 2 2 Consumo de recursos: costes espaciales y temporales . 6 3 Caracterizaci´ on de los costes . 10 4 Cotas del coste: casos mejor, peor y promedio . 27 5 Notaci´ on asint´ otica: jerarqu´ıa de costes computacionales . 34 6 Aspectos adicionales en complejidad computacional . 50
FI– UPV: 29 de noviembre de 2005
P´agina 3.1
PRG-3
Complejidad computacional
´Indice
◦ 1 Introducci´on . 2 2 Consumo de recursos: costes espaciales y temporales . 6 3 Caracterizaci´ on de los costes . 10 4 Cotas del coste: casos mejor, peor y promedio . 27 5 Notaci´ on asint´ otica: jerarqu´ıa de costes computacionales . 34 6 Aspectos adicionales en complejidad computacional . 50
FI– UPV: 29 de noviembre de 2005
P´agina 3.2
PRG-3
Complejidad computacional
Introducci´ on
Generalmente, un problema dado puede resolverse mediante muy diversos algoritmos o programas. No todas las soluciones son igualmente buenas. ¿De qu´e depende la calidad de un programa que resuelve un problema? ¿Elegancia de la idea en la que se basa el algoritmo? ¿Claridad en la organizaci´ on del c´ odigo del programa? ¿Vistosidad de la presentaci´ on de los resultados? ¿Eficiencia en la forma de obtener la soluci´ on? Desde un punto de vista computacional, el factor esencial es la eficiencia.
FI– UPV: 29 de noviembre de 2005
P´agina 3.3
PRG-3
Complejidad computacional
Introducci´ on
El an´ alisis de algoritmos es una actividad muy importante en el proceso de desarrollo, especialmente en entornos con recursos restringidos (en tiempo o en memoria). El an´alisis de algoritmos es necesario para: Comparar dos algoritmos distintos. Predecir el comportamiento de un algoritmo en circunstancias extremas. Ajustar los par´ametros de un algoritmo para obtener los mejores resultados.
FI– UPV: 29 de noviembre de 2005
P´agina 3.4
PRG-3
Complejidad computacional
Introducci´ on
El an´alisis se puede realizar de dos formas distintas: emp´ırica (experimental), o te´ oricamente. Tipo Experimental
Ventajas “Sencilla”, resultados “reales”
Te´ orica
Flexible, “barata”, independiente de la m´aquina
FI– UPV: 29 de noviembre de 2005
Inconvenientes Hace falta tener dos implementaciones igual de cuidadas, hacen falta datos reales, m´as costosa, dependiente de la m´aquina Resultados no “exactos”
P´agina 3.5
PRG-3
Complejidad computacional
´Indice
1 Introducci´ on . 2 ◦ 2 Consumo de recursos: costes espaciales y temporales . 6 3 Caracterizaci´ on de los costes . 10 4 Cotas del coste: casos mejor, peor y promedio . 27 5 Notaci´ on asint´ otica: jerarqu´ıa de costes computacionales . 34 6 Aspectos adicionales en complejidad computacional . 50
FI– UPV: 29 de noviembre de 2005
P´agina 3.6
PRG-3
Complejidad computacional
Consumo de recursos: costes espaciales y temporales Eficiencia: Capacidad de resolver el problema propuesto empleando un bajo consumo de recursos computacionales Dos factores fundamentales de la eficiencia: Coste espacial o cantidad de memoria requerida Coste temporal o tiempo necesario para resolver el problema. Para resolver un problema dado, un algoritmo o programa A ser´a mejor que otro B si A resuelve el problema en menos tiempo y/o emplea menos cantidad de memoria que B. En ocasiones tiempo y memoria son recursos competitivos y un buen algoritmo es aquel que resuelve el problema con un buen compromiso tiempo/memoria. En lo que sigue nos ocuparemos principalmente del coste temporal.
FI– UPV: 29 de noviembre de 2005
P´agina 3.7
PRG-3
Complejidad computacional
Un ejemplo simple El tiempo o la memoria por s´ı solos no son realmente adecuados para valorar la calidad de un programa: Consideremos tres programas simples para calcular 102: int main(){ /*A1*/ int m; m = 10 * 10; /*producto*/ printf("%d\n", m); }
int main(){ /*A2*/ int i,m; m=0; for (i=1; i<=10; i++) m = m + 10; /*suma*/ printf("%d\n", m); }
int main(){ /*A3*/ int i,j,m; m=0; for (i=1; i<=10; i++) for (j=1; j<=10; j++) m++; /*sucesor*/ printf("%d\n", m); } Sean t∗, t+, ts los tiempos que se requieren para un producto, una suma y un sucesor : TA1 = t∗ FI– UPV: 29 de noviembre de 2005
TA2 = 10 t+
TA3 = 100 ts P´agina 3.8
PRG-3
Complejidad computacional
Un ejemplo simple (cont.)
Supongamos que A1, A2, A3 se ejecutan en cuatro computadores con diferentes caracter´ısticas (diferentes tiempos de ejecuci´ on de sucesor, suma y producto): t∗ t+ ts A1 A2 A3
100 10 1 100 100 100
µs µs µs µs µs µs
50 10 2 50 100 200
µs µs µs µs µs µs
100 5 1 100 50 100
µs µs µs µs µs µs
200 10 0,5 200 100 50
µs µs µs µs µs µs
¿qu´e programa es mejor, A1, A2, A3 ?
Para cada computador hay un mejor programa
FI– UPV: 29 de noviembre de 2005
P´agina 3.9
PRG-3
Complejidad computacional
´Indice
1 Introducci´ on . 2 2 Consumo de recursos: costes espaciales y temporales . 6 ◦ 3 Caracterizaci´ on de los costes . 10 4 Cotas del coste: casos mejor, peor y promedio . 27 5 Notaci´ on asint´ otica: jerarqu´ıa de costes computacionales . 34 6 Aspectos adicionales en complejidad computacional . 50
FI– UPV: 29 de noviembre de 2005
P´agina 3.10
PRG-3
Complejidad computacional
Problemas, instancias y talla de una instancia
Nuestro “problema simple” era demasiado restrictivo. En la pr´actica querremos calcular no s´ olo 102 sino, en general, n2, donde n es un dato del problema. Seg´ un este nuevo planteamiento, el problema concreto de calcular 102 se considera una instancia del problema general de calcular n2. Dado un problema, en general no todas sus instancias son igual de “grandes”. A cada instancia se le puede asignar un n´ umero entero que mida la “envergadura” de esa instancia. A este entero se le denomina talla. En nuestro problema de c´alculo de n2, una medida natural de la talla es justamente n: As´ı, la talla de la instancia 102 es 10 y la talla de la instancia 2 345 6782 es 2 345 678.
FI– UPV: 29 de noviembre de 2005
P´agina 3.11
PRG-3
Complejidad computacional
Coste en funci´ on de la talla del problema Podemos reescribir f´acilmente A1, A2, A3 para calcular n2 en vez de 102: int main(){ /*A1*/ int n, m; scanf("%d", &n); m = n * n; /*producto*/ printf("%d\n", m); }
int main(){ /*A2*/ int i, n, m; m=0; scanf("%d", &n); for (i=1; i<=n; i++) m = m + n; /*suma*/ printf("%d\n", m); }
int main(){ /*A3*/ int i, j, n, m; m=0; scanf("%d", &n); for (i=1; i<=n; i++) for (j=1; j<=n; j++) m++; /*sucesor*/ printf("%d\n", m); } Talla=n; costes temporales (µs): TA1 = t∗
TA2 = t+ · n TA3 = ts · n2
¡El coste sigue dependiendo de t∗, t+, ts! FI– UPV: 29 de noviembre de 2005
P´agina 3.12
PRG-3
Complejidad computacional
El coste como funci´ on de la talla sigue sin ser adecuado Intuitivamente parece claro que el mejor programa es A1 y el peor A3. Pero, incluso fijando las caracter´ısticas del computador, veremos que esta intuici´ on no se mantiene claramente. Por ejemplo si fijamos t∗ = 100 µs, t+ = 5 µs, ts = 1 µs:
A1 A2 A3
TAi(n) 100 5n n2
n=4 100 µs 20 µs 16 µs
n = 10 100 µs 50 µs 100 µs
n = 1 000 100 µs 5 000 µs 1 000 000 µs
¿qu´e programa es mejor, A1, A2, A3 ? Para cada talla hay un mejor programa Una buena caracterizaci´ on del coste deber´ıa permitir establecer la “calidad” de un programa con independencia tanto del computador como de la talla de las instancias concretas a procesar.
FI– UPV: 29 de noviembre de 2005
P´agina 3.13
PRG-3
Complejidad computacional
Coste asint´ otico En general, tendr´ıamos un comportamiento relativo de A1, A2, A3 tal como:
A1 < A2 < A3
A2 < A1 < A3
A2 < A3 < A1
A3 < A2 < A1
Coste temporal
Cálculo de n²: costes relativos de A1, A2, A3 A3
A2 A1
0 0 Talla
Una buena caracterizaci´ on computacional de un programa: Dependencia funcional del coste con la talla – ¡para tallas grandes! FI– UPV: 29 de noviembre de 2005
P´agina 3.14
PRG-3
Complejidad computacional
Ventajas de la caracterizaci´ on asint´ otica del coste computacional en funci´ on de la talla
Generalmente los programas s´ olo son u ´tiles para resolver problemas de gran talla (si es peque˜ na podr´ıamos resolverlos manualmente sin dificultad) Al considerar s´ olo tallas grandes, se pueden hacer aproximaciones sencillas que simplifican considerablemente el an´alisis del coste. La bondad relativa de distintos programas ya no depende de los valores concretos de los tiempos de ejecuci´ on de las distintas operaciones elementales empleadas (siempre que ´ estos no dependan de la talla), ni de la talla concreta de las instancias del problema a resolver
FI– UPV: 29 de noviembre de 2005
P´agina 3.15
PRG-3
Complejidad computacional
Simplificaci´ on del an´ alisis del coste: concepto de “paso” Un PASO es la ejecuci´ on de un segmento de c´ odigo cuyo tiempo de proceso no depende de la talla del problema considerado, o bien est´ a acotado por alguna constante. Coste computacional de un programa: N´ umero de PASOS en funci´ on de la talla del problema. Construcciones a las que se les puede asignar 1 PASO: Asignaci´ on, operaciones aritm´eticas o l´ ogicas, comparaci´ on, acceso a un elemento de vector o matriz, etc. Cualquier secuencia finita de estas operaciones cuya longitud no dependa de la talla. Construcciones a las que no se le puede asignar 1 PASO, sino un n´ umero de PASOS en funci´ on de la talla: Asignaci´ on de variables estructuradas (ej. vectores) cuyo n´ umero de elementos dependa de la talla Bucles cuyo n´ umero de iteraciones dependa de la talla. FI– UPV: 29 de noviembre de 2005
P´agina 3.16
PRG-3
Complejidad computacional
An´ alisis de costes (PASOS) de los programas de c´ alculo de n2 int main(){ /*A1*/ int n, m; scanf("%d", &n); m = n * n; /*producto*/ printf("%d\n", m); }
int main(){ /*A2*/ int i, n, m; m=0; scanf("%d", &n); for (i=1; i<=n; i++) m = m + n; /*suma*/ printf("%d\n", m); }
int main(){ /*A3*/ int i, j, n, m; m=0; scanf("%d", &n); for (i=1; i<=n; i++) for (j=1; j<=n; j++) m++; /*sucesor*/ printf("%d\n", m); } TA1(n) = 1,
FI– UPV: 29 de noviembre de 2005
TA2(n) = n,
TA3(n) = n2
P´agina 3.17
PRG-3
Complejidad computacional
Otro ejemplo de an´ alisis del coste en PASOS: impresi´ on de los elementos de un vector en orden inverso #include #define MAXN 1000000 int main() /* invOrd.c */ { int i, n, x, v[MAXN]; n = 0; /* Inicializa contador de datos (talla) */ printf("Teclear datos (fin: ^D)\n"); while ((n < MAXN) && (scanf("%d", &x) == 1)) { /* Lee datos */ v[n] = x; /* Actualiza talla */ n++; } /* Imprime resultados en orden inverso */ for (i = n-1; i >= 0; i--) printf("%d ", v[i]); printf("\n"); return 0; } PASO: Accesos a v; FI– UPV: 29 de noviembre de 2005
Talla = n; TinvOrd(n) = n + n = 2n PASOS P´agina 3.18
PRG-3
Complejidad computacional
M´ as ejemplos de an´ alisis del coste en PASOS: b´ usqueda del elemento m´ as cercano a la media #include #include #define MAX 100000 int main() { int cercano, i, n = 0, aux, A[MAX]; double media, suma; while (n < MAX && scanf("%d", &aux) == 1) { A[n] = aux; n++; } suma = 0; for (i = 0; i < n; i++) suma += A[i]; media = suma/n; cercano = 0; /* C´ alculo de la media */ for (i = 1; i < n; i++) /* B´ usqueda del m´ as cercano */ if (fabs(A[i]-media) < fabs(A[cercano]-media)) cercano = i; printf("El m´ as cercano es A[%d]=%d\n", cercano, A[cercano]); } PASO: Accesos a A; FI– UPV: 29 de noviembre de 2005
Talla = n; Tmascerca(n) =??? PASOS P´agina 3.19
PRG-3
Complejidad computacional
M´ as ejemplos de an´ alisis del coste en PASOS: c´ alculo de la moda de una serie de edades: lectura de datos #include #define MAXDATOS 100000 #define MAXEDAD 150 int main() /* modax.c: c´ alculo de la moda */ { int i, j, n, edad, frec, maxFrec, moda, edades[MAXDATOS]; n = 0; /* Inicializa contador de datos (talla) */ printf("Teclear edades, finalizando con ^D\n"); while ((n < MAXDATOS) && (scanf("%d", &edad) != EOF)) /* Lee edades if ((edad >= 0) && (edad < MAXEDAD)) { /* hasta EOF, edades[n] = edad; /* las memoriza n++; /* y actualiza n }
FI– UPV: 29 de noviembre de 2005
*/ */ */ */
P´agina 3.20
PRG-3
Complejidad computacional
M´ as ejemplos de an´ alisis del coste en PASOS: c´ alculo (ineficiente) de la moda de una serie de edades /* moda0.c: c´ alculo (ineficiente) de la moda */ maxFrec=0; /* Explora n veces edades[] para */ for (i = 0; i < n; i++) { /* determinar cu´ al es la edad */ frec = 0; /* que mas se repite (moda) */ for (j = 0; j < n; j++) if (edades[i] == edades[j]) frec++; if (frec > maxFrec) { maxFrec = frec; moda = edades[i]; } } printf("Leidos %d datos; Moda=%d (frecuencia=%d)\n", n, moda, maxFrec); return 0; } PASO: Comparaciones en if;
FI– UPV: 29 de noviembre de 2005
Talla = n; Tmod(n) =??? PASOS
P´agina 3.21
PRG-3
Complejidad computacional
M´ as ejemplos de an´ alisis del coste en PASOS: c´ alculo m´ as eficiente de la moda de una serie de edades /* moda1.c: c´ alculo (poco eficiente) de la moda */ maxFrec = 0; /* Explora edades[] maxEdad veces para */ for (i = 0; i < MAXEDAD; i++) { /* determinar cu´ al es la edad */ frec = 0; /* que m´ as se repite (moda) */ for (j = 0; j < n; j++) if (edades[j] == i) frec++; if (frec > maxFrec) { maxFrec = frec; moda = i; } } printf("Leidos %d datos; Moda=%d (frecuencia=%d)\n", n, moda, maxFrec); return 0; } PASO: Comparaciones en if;
FI– UPV: 29 de noviembre de 2005
Talla = n;
Tmoda(n) =??? PASOS
P´agina 3.22
PRG-3
Complejidad computacional
M´ as ejemplos de an´ alisis del coste en PASOS: c´ alculo eficiente de la moda de una serie de edades #include #define MAXEDAD 150 int main() /* moda.c: c´ alculo eficiente de la moda */ { int n = 0, edad, maxFrec = 0, moda, frecs[MAXEDAD]; /* Inicializa vector de frecuencias */ for (edad = 0; edad < MAXEDAD; edad++) frecs[edad] = 0; printf("Teclear edades, fin con ^D\n"); /* Lee edades hasta EOF */ while (scanf("%d", &edad) != EOF) /* y actualiza frecuencias */ if ((edad >= 0) && (edad < MAXEDAD)) { n++; frecs[edad]++; } for (edad = 0; edad < MAXEDAD; edad++) /* m´ ax. frecuencia (moda) */ if (frecs[edad] > maxFrec) { maxFrec = frecs[edad]; moda = edad; } printf("Leidos %d datos; Moda=%d (frecuencia=%d)\n", n,moda,maxFrec); } PASO: Comparaciones en if; Talla = n; Tmoda(n) =??? PASOS FI– UPV: 29 de noviembre de 2005
P´agina 3.23
PRG-3
Complejidad computacional
Costes de las variantes del c´ alculo de la moda: representaci´ on gr´ afica
80 70
moda0 moda1 moda
Tiempo (segundos)
60 50 40 30 20 10 0 10000 20000 30000 40000 50000 60000 70000 80000 90000 100000 Talla (número de edades procesadas)
FI– UPV: 29 de noviembre de 2005
P´agina 3.24
PRG-3
Complejidad computacional
Costes de las variantes del c´ alculo de la moda: comparaci´ on de las versiones m´ as eficientes
0.7 0.6
moda0 moda1 moda
Tiempo (segundos)
0.5 0.4 0.3 0.2 0.1 0 10000 20000 30000 40000 50000 60000 70000 80000 90000 100000 Talla (número de edades procesadas)
FI– UPV: 29 de noviembre de 2005
P´agina 3.25
PRG-3
Complejidad computacional
M´ as ejemplos de an´ alisis del coste en PASOS: funciones extra˜ nas #include int f1(int x, int n) { int i; for (i = 1; i <= n; i++) x += i; return x; }
int main() { int a, n; scanf("%d", &n); a = f2(0, n); printf("%d\n", f1(a, n)); return 0; }
int f2(int x, int n) { int i; for (i = 1; i <= n; i++) x += f1(i, n); return x; } PASO: +=; Talla = n; Tmain(n) =??? PASOS
FI– UPV: 29 de noviembre de 2005
P´agina 3.26
PRG-3
Complejidad computacional
´Indice
1 Introducci´ on . 2 2 Consumo de recursos: costes espaciales y temporales . 6 3 Caracterizaci´ on de los costes . 10 ◦ 4 Cotas del coste: casos mejor, peor y promedio . 27 5 Notaci´ on asint´ otica: jerarqu´ıa de costes computacionales . 34 6 Aspectos adicionales en complejidad computacional . 50
FI– UPV: 29 de noviembre de 2005
P´agina 3.27
PRG-3
Complejidad computacional
A menudo el coste NO es (s´ olo) funci´ on de la talla En los ejemplos vistos hasta ahora, todas las “instancias” de una talla dada ten´ıan el mismo coste computacional. Pero esto no es siempre as´ı. En el siguiente ejemplo, ¿cu´al es el coste de la funci´ on busca(n)?: #include #define MAXN 1000000 int busca(int *v, int n, int x) /* busca x en v[0...n-1] */ { int i; for (i=0; i
FI– UPV: 29 de noviembre de 2005
P´agina 3.28
PRG-3
Complejidad computacional
A menudo el coste NO es (s´ olo) funci´ on de la talla int main() /* busca.c */ { int i, x, aux; int v[MAXN], n = 0;
/* Vector donde buscar y su talla */
printf("Teclear datos, fin con ^D)\n"); while ((n < MAXN) && (scanf("%d", &aux) != EOF)) { /* lee v[] */ v[n] = aux; n++; } printf("Dato a buscar: "); while (scanf("%d", &x) == 1) { i = busca(v, n, x); printf("Posici´ on de %d: %d\n", x, i); printf("Dato a buscar: "); } return 0; } PASO: comparaci´ on en if;
Talla = n;
Tbusca(n) = ???
¡Depende del contenido del vector y del valor concreto del elemento a buscar! FI– UPV: 29 de noviembre de 2005
P´agina 3.29
PRG-3
Complejidad computacional
Extremos del coste: casos mejor, peor y promedio Número de PASOS requeridos por ‘busca’
Cota Superior (peor caso) Costes de cada Instancia Coste Promedio Coste temporal
Cota Inferior (mejor caso)
0 0 Talla b Tbusca (n) = 1
FI– UPV: 29 de noviembre de 2005
w Tbusca (n) = n
m Tbusca (n) = n/2
P´agina 3.30
PRG-3
Complejidad computacional
A veces es dif´ıcil calcular costes “exactos” para cada talla. Ejemplo: #include #define K 64 #define maxN 1000000 int main() /* raro.c: Realiza un extra~ no proceso sobre un vector */ { int i, j, k, n, x, X[maxN], pasos; n = 0; pasos = 1; printf("Teclear datos\n"); while ((n < maxN) && (scanf("%d", &x) != EOF)) { X[n] = x; n++; }
FI– UPV: 29 de noviembre de 2005
/* lee datos */
P´agina 3.31
PRG-3
Complejidad computacional
Ejemplo (cont.) for (i = 2; i < n; i++) { /* procesa datos */ for (k = 1; k <= K; k++) X[i] = X[i] + k; if (n % 3 == 0) { for (k = 1; k <= K; k++) X[i] = X[i] - k; if ((i % 2 == 0) && (X[i] != X[i-1])) for (j = i; j <= n - 2; j++) for (k = 1; k <= K; k++) X[i] = k * X[i]; } else for (j = i; j <= n - i; j = j + 2) if (X[i] % 2 == 0) for (k = 1; k <= K; k++) X[i] = X[i] + 2 * k; } for (i = 0; i < n; i++) printf("%d\n", X[i]); } PASO: accesos a X. El n´ umero total de pasos var´ıa de manera diferente con las instancias de cada talla seg´ un ´esta sea o no m´ ultiplo de 3. FI– UPV: 29 de noviembre de 2005
P´agina 3.32
PRG-3
Complejidad computacional
Cotas superior e inferior de los costes Número de PASOS requeridos por el programa ‘raro’
Cota Superior Coste Peor caso Costes Instancias Coste temporal
Coste Mejor caso Cota Inferior
0 0 Talla
Generalmente es suficiente determinar las cotas asint´ oticas; es decir para talla >>> FI– UPV: 29 de noviembre de 2005
P´agina 3.33
PRG-3
Complejidad computacional
´Indice
1 Introducci´ on . 2 2 Consumo de recursos: costes espaciales y temporales . 6 3 Caracterizaci´ on de los costes . 10 4 Cotas del coste: casos mejor, peor y promedio . 27 ◦ 5 Notaci´ on asint´ otica: jerarqu´ıa de costes computacionales . 34 6 Aspectos adicionales en complejidad computacional . 50
FI– UPV: 29 de noviembre de 2005
P´agina 3.34
PRG-3
Complejidad computacional
Aspectos esenciales en la determinaci´ on de costes computacionales El coste no se puede expresar por un u ´nico valor (ej. el “tiempo de ejecuci´ on”, sino que debe ser una funci´ on de la talla del problema a resolver La comparaci´ on de funciones de coste debe ser insensible a “constantes de implementaci´ on” tales como los tiempos concretos de ejecuci´ on de operaciones individuales (cuyo coste sea independiente de la talla) La independencia de las constantes se consigue considerando s´ olo el comportamiento asint´ otico de la funci´ on de coste (es decir, para tallas grandes) A menudo ocurre que, para una talla dada, hay diversas instancias con costes diferentes, por lo que el coste no puede expresarse propiamente como funci´ on de la talla En estas ocasiones conviene determinar cotas superiores e inferiores de la funci´ on coste; es decir, en el peor caso y en el mejor caso Hay situaciones en las que incluso las cotas para mejores y peores casos son funciones complicadas. Generalmente bastar´a determinar funciones simples que acoten superior e inferiormente los costes de todas las instancias para tallas grandes FI– UPV: 29 de noviembre de 2005
P´agina 3.35
PRG-3
Complejidad computacional
Notaci´ on asint´ otica Abstracci´ on de las constantes asociadas al concepto de “PASO”, de la noci´ on de “tallas grandes” y de la de “cotas asint´ oticas”: Sea f : N → R+ una funci´ on de los naturales en los reales positivos. Se define: . O(f (n)) = {t : N → R+ | (∃c ∈ R+, ∃n0 ∈ N), ∀n ≥ n0 t(n) ≤ cf (n)} . Ω(f (n)) = {t : N → R+ | (∃c ∈ R+, ∃n0 ∈ N), ∀n ≥ n0 t(n) ≥ cf (n)} . Θ(f (n)) = O(f (n)) ∩ Ω(f (n)) A partir de la definici´ on de Θ(f (n)) se tiene: Θ(f (n)) = {t : N → R+ | (∃c1, c2 ∈ R+, ∃n0 ∈ N), ∀n ≥ n0 c1f (n) ≤ t(n) ≤ c2f (n)}
FI– UPV: 29 de noviembre de 2005
P´agina 3.36
PRG-3
Complejidad computacional
Ejemplos
t(n) = 3n + 2 t(n) = 100n + 6 t(n) = 10n2 + 4n + 2 t(n) = n2 + 1000n − 100
FI– UPV: 29 de noviembre de 2005
P´agina 3.37
PRG-3
Complejidad computacional
Ejemplos
t(n) = 3n + 2 t(n) = 100n + 6
t(n) = 10n2 + 4n + 2 t(n) = n2 + 1000n − 100
FI– UPV: 29 de noviembre de 2005
≤ 4n ∀n ≥ 2 ≥ 3n ∀n ≥ 1
⇒ t(n) ∈ O(n) ⇒ t(n) ∈ Ω(n) ;
t(n) ∈ Θ(n)
≤ 101n ∀n ≥ 6 ⇒ t(n) ∈ O(n) ≥ 100n ∀n ≥ 1 ⇒ t(n) ∈ Ω(n) ;
t(n) ∈ Θ(n)
≤ 11n2 ∀n ≥ 5 ⇒ t(n) ∈ O(n2) ≥ 10n2 ∀n ≥ 1 ⇒ t(n) ∈ Ω(n2) ;
t(n) ∈ Θ(n2)
≤ 2n2 ∀n ≥ 1000 ⇒ t(n) ∈ O(n2) ≥ n2 ∀n ≥ 1 ⇒ t(n) ∈ Ω(n2) ;
t(n) ∈ Θ(n2)
P´agina 3.38
PRG-3
Complejidad computacional
Ejemplos de costes en notaci´ on asint´ otica A1, A2, A3: Moda:
TA1(n) ∈ Θ(1)
TA2(n) ∈ Θ(n)
Tmoda(n) ∈ Θ(n2) (ineficiente)
TA3(n) ∈ Θ(n2)
Tmoda(n) ∈ Θ(n) (eficiente)
Número de PASOS requeridos por ‘busca’
Cota Superior (peor caso) Costes de cada Instancia Coste Promedio Coste temporal
Cota Inferior (mejor caso)
busca: Peor caso: O(n) Mejor caso: Ω(1) Promedio: O(n)
0 0 Talla Número de PASOS requeridos por el programa ‘raro’
raro: Peor caso: O(n2) Mejor caso: Ω(n) Promedio: O(n2)
Cota Superior Coste Peor caso Costes Instancias Coste temporal
Coste Mejor caso Cota Inferior
0 0 Talla
FI– UPV: 29 de noviembre de 2005
P´agina 3.39
PRG-3
Complejidad computacional
Notaci´ on asint´ otica: algunas propiedades u ´tiles Relaci´ on de orden entre ´ ordenes de funciones: f (n) ∈ Θ(f (n)) O(f (n)) ⊂ O(g(n)) ⇔ f (n) ∈ O(g(n)) ∧ g(n) ∈ / O(f (n)) f (n) ∈ O(g(n)) ⇔ g(n) ∈ Ω(f (n)) Orden de suma de funciones: funci´ on dominante • (fi(n) ∈ Θ(gi(n)) 1 ≤ i ≤ k) ⇒
k X i=1
fi(n) ∈ Θ ( m´ ax gi(n)) 1≤i≤k
M´as propiedades u ´tiles: Ferri, Albert i Mart´ın: Introducci´ o a l’an`alisi i `ncia, 1998, pag. 55. diseny d’algorismes, Universitat de Vale
FI– UPV: 29 de noviembre de 2005
P´agina 3.40
PRG-3
Complejidad computacional
Propiedades u ´tiles para an´ alisis asint´ oticos Regla del l´ımite Para dos funciones arbitrarias f y g: N → R+: f (n) • si l´ım ∈ R+ entonces f (n) ∈ Θ(g(n)) n→∞ g(n) f (n) = 0 entonces f (n) ∈ O(g(n)) pero f (n) 6∈ Θ(g(n)), y • si l´ım n→∞ g(n) f (n) • si l´ım = +∞ entonces f (n) ∈ Ω(g(n)) pero f (n) 6∈ Θ(g(n)) n→∞ g(n)
Por ejemplo, f (n) = log n y g(n) = relativo? •
f (n) log n l´ım = l´ım √ n→∞ g(n) n→∞ n
FI– UPV: 29 de noviembre de 2005
L‘Hopital
=
p
(n). ¿Cu´al es su orden
2 1/n √ = l´ım √ = 0 l´ım n→∞ 1/(2 n) n→∞ n
P´agina 3.41
PRG-3
Complejidad computacional
Notaci´ on asint´ otica: m´ as propiedades u ´tiles Algunas sumas de series • Serie aritm´etica: ai = ai−1 + r ⇒ n X
a1 + an r ai = n = a1 n + n (n − 1) 2 2 i=1
•
•
n X
n+1 i = n 2 i=1
n X i=1
2
i
1 1 = n (n + 1) (n + ) 3 2
Mas sumas u ´tiles: Ferri, Albert i Mart´ın: Introducci´ o a l’an`alisi i `ncia, 1998, pag. 60. diseny d’algorismes, Universitat de Vale FI– UPV: 29 de noviembre de 2005
P´agina 3.42
PRG-3
Complejidad computacional
Notaci´ on asint´ otica: m´ as propiedades u ´tiles ´ Ordenes de funciones polin´ omicas • c ∈ Θ (1), •
•
•
k X i=0 n X i=1 n X
∀c ∈ R+
cini ∈ Θ (nk ),
∀ck ∈ R+, ∀ci ∈ R, 1 ≤ i < k
ik ∈ Θ (nk+1),
∀k ∈ N+
(n − i)k ∈ Θ (nk+1),
∀k ∈ N+
i=1
FI– UPV: 29 de noviembre de 2005
P´agina 3.43
PRG-3
Complejidad computacional
Notaci´ on asint´ otica: otras propiedades ´ Ordenes de funciones exponenciales, logar´ıtmicas, etc. • n! ∈ Ω (2n), n! ∈ O (nn) • •
log(n!) ∈ Θ (n log n) n X
ri ∈ Θ (rn), ∀r ∈ R>1
i=1
•
n X 1 i=1
•
i
∈ Θ (log n)
n X i >1 ∈ Θ (1), ∀r ∈ R i r i=1
Ver tambi´en: Ferri, Albert i Mart´ın: Introducci´ o a l’an`alisi i diseny `ncia, 1998, Ap`endix A. d’algorismes, Universitat de Vale FI– UPV: 29 de noviembre de 2005
P´agina 3.44
PRG-3
Complejidad computacional
Notaci´ on asint´ otica: jerarqu´ıa de costes computacionales
Algunas relaciones entre ´ ordenes usuales: Exponenciales · · · Polin´ omicas | Superlineales · · · | Lineales | | | √ O(1) ⊂ O(log n) ⊂ O( n) ⊂ O(n) ⊂ O(n log n) ⊂ O(n2) ⊂ O(n3) ⊂ O(2n) ⊂ O(nn) | | | | | Lineales | | · · · Sublineales | Logar´ıtmicas Constantes
FI– UPV: 29 de noviembre de 2005
P´agina 3.45
PRG-3
Complejidad computacional
Notaci´ on asint´ otica: jerarqu´ıa de costes computacionales
10
100
O(n3) 8
80
O(n2) O(n)
6
60
( )
4
40
O n 2
O(n*log(n)) 20
O(log(n))
O(n)
O(1) 0
0 0
2
4
6
8
10
0
5
10
15
20
sublineales, lineales y superlineales
FI– UPV: 29 de noviembre de 2005
P´agina 3.46
PRG-3
Complejidad computacional
Notaci´ on asint´ otica: jerarqu´ıa de costes computacionales
100
O(2n)
1400
O(n3)
O(nn)
O(n3)
1200
80
O(n2)
O(n!)
1000
60 800 600
40
O(n*log(n)) 400 20 200
O(n)
0
0 0
5
10
15
20
0
2
4
6
8
10
12
superlineales, polin´ omicas y exponenciales
FI– UPV: 29 de noviembre de 2005
P´agina 3.47
PRG-3
Complejidad computacional
Jerarqu´ıa de costes computacionales: consecuencias pr´ acticas M´aximo tama˜ no aproximado de un problema, n, que puede ser resuelto por diversos algoritmos y computadores con distintas velocidades de proceso: Coste temporal log2 n n n log2 n n2 2n
1 paso = 1 ms 1 seg 1 min 1 hora 330
≈ 10 1 000 141 32 10
2·104
≈ 10 6 · 104 4 896 245 16
1016
≈ 10 3,6 · 106 2 · 105 1 897 22
1 paso = 0.1 ms (10 veces mas r´apido) 1 seg 1 min 1 hora n0=f (n) 3·103
≈ 10 104 1 003 100 13
2·105
≈ 10 6 · 105 4 · 104 775 19
1017
≈ 10 3,6 · 107 1,7 · 106 6 000 25
n10 10 n ≈ 9n 3,16 n n+3
Al aumentar el tiempo de c´alculo y/o la velocidad del computador, un algoritmo · · · logar´ıtmico incrementa enormemente la talla de los problemas abordables lineal (o n log n) consigue incrementos lineales (o casi) de las tallas manejables cuadr´ atico (polin´ omico) consigue mejoras proporcionales moderadas exponencial solo logra mejoras aditivas despreciables FI– UPV: 29 de noviembre de 2005
P´agina 3.48
PRG-3
Complejidad computacional
Jerarqu´ıa de costes computacionales: consecuencias pr´ acticas (II) Tiempos de ejecuci´ on en una m´aquina que ejecuta 109 pasos por segundo (∼ 1 GHz), en funci´ on del coste del algoritmo y del tama˜ no del problema n: Talla 10 20 30 40 50 100 1000 10000 100000 1000000
log2 n 3.322 ns 4.322 ns 4.907 ns 5.322 ns 5.644 ns 6.644 ns 10 ns 13 ns 17 ns 20 ns
FI– UPV: 29 de noviembre de 2005
n 10 ns 20 ns 30 ns 40 ns 50 ns 100 ns 1 µs 10 µs 100 µs 1 ms
n log2 n 33 ns 86 ns 147 ns 213 ns 282 ns 664 ns 10 µs 133 µs 2 ms 20 ms
n2 100 ns 400 ns 900 ns 2 µs 3 µs 10 µs 1 ms 100 ms 10 s 16.7 min
n3 1 µs 8 µs 27 µs 64 µs 125 µs 1 ms 1s 16.7 min 11.6 d´ıas 31.7 a˜ nos
2n 1 µs 1 ms 1s 18.3 min 13 d´ıas 40·1012 a˜ nos
P´agina 3.49
PRG-3
Complejidad computacional
´Indice
1 Introducci´ on . 2 2 Consumo de recursos: costes espaciales y temporales . 6 3 Caracterizaci´ on de los costes . 10 4 Cotas del coste: casos mejor, peor y promedio . 27 5 Notaci´ on asint´ otica: jerarqu´ıa de costes computacionales . 34 ◦ 6 Aspectos adicionales en complejidad computacional . 50
FI– UPV: 29 de noviembre de 2005
P´agina 3.50
PRG-3
Complejidad computacional
Otros conceptos de inter´ es en complejidad computacional Complejidad espacial Concepto de posici´ on de memoria: espacio de almacenamiento ocupado por uno o m´as datos, cuya extensi´ on es independiente de la talla de las instancias del problema considerado Coste espacial de un programa o algoritmo: n´ umero de posiciones de memoria requeridas para su ejecuci´ on Todos los conceptos estudiados en el an´alisis de coste temporal son directamente aplicables para el coste espacial
Talla de una instancia definida por m´ as de un par´ ametro (ej. talla de una matriz de m × n)
FI– UPV: 29 de noviembre de 2005
P´agina 3.51