Вы находитесь на странице: 1из 46

Complejidad

Tomado del Curso de Estructura de Datos Ingeniera en Informtica. Universidad Carlos III de Madrid

ndice
3.1 Complejidad computacional y asinttica 3.2 Ejemplos de complejidad asinttica 3.3 La notacin O 3.4 Anlisis del caso mejor, peor y medio

Complejidad computacional y asinttica

Entrada

Algoritmo

Salida

Complejidad computacional y asinttica


Para resolver un problema suele ser habitual disponer de varios algoritmos. Ejemplo: para obtener el maximo comun d.ivisor de dos nmeros se puede:
Clculo de divisores Descomponer en factores primos Utilizar el Algoritmo de Euclides

El objetivo es elegir el algoritmo ms eficiente de ellos

Complejidad computacional y asinttica


Regla: La eleccin del algoritmo nunca debera afectar a la correccin de la solucin ni a la claridad (evitar algoritmos incomprensibles). Excepcin: A veces se eligen algoritmos aproximados o heursticos porque la solucin correcta resulta inmanejable. No alcanzan la solucin ptima pero s a una solucin aceptable.
Ejemplos:
Algoritmo aproximado: Clculo de la raz cuadrada Heurstica: Problema del agente viajero

Mito:
La capacidad de computacin es ilimitada, por qu preocuparse de la eficiencia si siempre podemos encontrar un sistema ms potente? Adems estaba la Ley de Moore

Complejidad computacional y asinttica


Para comparar algoritmos se puede utilizar una medida del grado de dificultad del algoritmo: la complejidad computacional

COMPLEJIDAD COMPUTACIONAL Indica el esfuerzo que hay que realizar para aplicar un algoritmo y lo costoso que ste resulta. Dicho coste que se puede medir de diversas formas (espacio (memoria), tiempo, numro, tipo de pasos, cantidad de unidades de procesamiento...)

Complejidad computacional y asinttica

Complejidad computacional y asinttica


Objetivo: encontrar algoritmos con la menor complejidad espacial y temporal
Menor complejidad espacial suele implicar mayor complejidad temporal

Nos centraremos en complejidad temporal por ser el recurso ms crtico

Complejidad computacional y asinttica


Factores que influyen en la complejidad
Tamao del problema Naturaleza de los datos de entrada Recursos hardware y software

Complejidad computacional y asinttica


Factores que influyen en la complejidad
Tamao del problema: magnitud(es) que al aumentar incrementan la complejidad del algoritmo.
Ejemplos: Ordenacin de un vector: nmero de elementos Factorizar un nmero en sus factores primos: valor del nmero

Complejidad computacional y asinttica


Factores que influyen en la complejidad
Naturaleza de los datos de entrada: en funcin de cules sean los datos del problema se ejecutarn o no determinadas instrucciones de decisin y ser distinto el nmero de iteraciones de los bucles el problema se resolver en ms o en menos tiempo.
Ejemplo: buscar en un vector el valor que est almacenado en la primera celda resulta trivial en la bsqueda lineal.

Complejidad computacional y asinttica


Factores que influyen en la complejidad
Naturaleza de los datos de entrada:
Caso mejor: los datos de entrada consumen el mnimo Caso peor: los datos de entrada consumen el mximo (cota superior). Caso promedio: los datos se distribuyen de forma aleatoria. Difcil de calcular.

Complejidad computacional y asinttica


Enfoques para medir la complejidad de un algoritmo:
Enfoque empricos o a posteriori Enfoque terico o a priori.

Complejidad computacional y asinttica


Enfoque empricos o a posteriori
1. Escribir un programa que implemente el algoritmo, por ejemplo en Java. 2. Ejecutar el programa con entradas de tamao y composicin variadas 3. Usar un mtodo como System.currentTimeMillis() para obtener una medida exacta del tiempo de ejecucin real 4. Trazar los resultados
14

Complejidad computacional y asinttica


Enfoque tericos o a priori
1. Utilizar una descripcin de alto nivel del algoritmo (v.g. en pseudocdigo) 2. Determinar, matemticamente, la cantidad de recursos necesarios para ejecutar el algoritmo 3. Obtener una funcin genrica f(n) que permita hacer predicciones sobre la utilizacin de recursos, siendo n el tamao del problema

Complejidad computacional y asinttica


Ventajas e inconvenientes
1. El estudio a posteriori requiere la implementacin del algoritmo (mayor coste). El estudio a priori solo requiere de una descripcin de alto nivel (pseudocdigo). 2. En el estudio a posteriori no tenemos la seguridad de los recursos que realmente se van a consumir si varan las entradas. El estudio a priori es independiente de los datos de entrada. 3. En el estudio a posteriori, los resultados slo sern vlidos para unas determinadas condiciones de ejecucin. Es difcil extrapolar los resultados si se producen cambios en el hardware, sistema operativo, lenguaje utilizado, etc. El estudio a priori es independiente de las condiciones de ejecucin. 4. El estudio a posteriori permite hacer una evaluacin experimental de los recursos consumidos que no es posible en el estudio a priori.

Complejidad computacional y asinttica


Principio de invarianza:
Dos implementaciones de un mismo algoritmo no diferirn ms que en una constante multiplicativa. Si f1(n) y f2(n) son los tiempos consumidos por dos implementaciones de un mismo algoritmo, se verifica que: c, d R, f1(n) cf2(n) f2(n) df1(n)

El estudio a posteriori trata con programas. El estudio a priori trata con algoritmos

Es preferible el estudio a priori

Complejidad computacional y asinttica


COMPLEJIDAD ASINTTICA Consiste en el clculo de la complejidad temporal a priori de un algoritmo en funcin del tamao del problema, n, prescindiendo de factores constantes multiplicativos y suponiendo valores de n muy grandes No sirve para establecer el tiempo exacto de ejecucin, sino que permite especificar una cota (inferior, superior o ambas) para el tiempo de ejecucin de un algoritmo

Ejemplos de complejidad asinttica


Ejemplo en pseudocdigo:
Buscar el mximo valor de un array
maximoArray(A)mximo Entrada A array de n enteros Salida elemento mximo de A INICIO maxActual A[0] PARA i 1 HASTA n - 1 HACER SI A[i] > maxActual ENTONCES maxActual A[i] DEVOLVER maxActual FIN

Ejemplos de complejidad asinttica


Ejemplo en pseudocdigo: Operaciones primitivas
Cmputos bsicos realizados por un algoritmo Identificables en pseudocdigo Muy independiente del lenguaje de programacin La definicin exacta no es importante Ejemplos: Evaluar una expresin Asignar un valor a una variable Indexar un array Llamar a un mtodo Retornar un valor

Ejemplos de complejidad asinttica


Revisando el pseudocdigo, se puede estipular el nmero mximo de operaciones primitivas ejecutadas por un algoritmo, como una funcin del tamao de la entrada
maximoArray(A) INICIO maxActual A[0] PARA i 1 HASTA n - 1 HACER SI A[i] > maxActual ENTONCES maxActual A[i] { incrementar contador i } DEVOLVER maxActual FIN Total 7n - 1 operaciones 2 2+n 2(n - 1) 2(n - 1) 2(n - 1) 1

Ejemplos de complejidad asinttica


El algoritmo maximoArray ejecuta 7n - 1 operaciones primitivas en el peor de los casos Se definen: a Tiempo tardado por la op. primitiva ms rpida b Tiempo tardado por la op. primitiva ms lenta Sea T(n) el tiempo de ejecucin real para el peor de los casos de maximoArray . Entonces: a (7n - 1) T(n) b(7n - 1) Por lo tanto, el tiempo de ejecucin T(n) est acotado por dos funciones lineales

Ejemplos de complejidad asinttica


Un cambio en el entorno hardware/software Afecta a T(n) en un factor constante, pero No altera la tasa de crecimiento de T(n) La tasa de crecimiento lineal del tiempo de ejecucin T(n) es una propiedad intrnseca del algoritmo maximoArray

Ejemplos de complejidad asinttica


Tasa de crecimiento:
Lineal n Cuadrtica n2 Cbica n3

En un diagrama logartmico, la pendiente de la lnea corresponde a la tasa de crecimiento de la funcin

Ejemplos de complejidad asinttica


La tasa de crecimiento no se ve afectada por:
factores constantes trminos de orden menor

Ejemplos
102n + 105 es una funcin lineal 105n2 + 108n es una funcin cuadrtica

La notacin O
Dadas las funciones f(n) y g(n), se dice que f(n) es O(g(n)) si existen constantes positivas c y n0 tales que f(n) cg(n) para n n0 Ejemplo: 2n + 10 es O (n) 2n + 10 cn (c - 2) n 10 n 10/(c - 2) Elegir c = 3 y n0 = 10

La notacin O
Ejemplo:
5n3 + 3n2 +1 O(n3) tomando n0= 3, c= 6 tenemos que: 5n3 + 3n2 +1 6n3 Nota: Tambin pertenecera a O(n4), pero no a O(n2).

La notacin O
Existen diferentes notaciones para la complejidad asinttica Una de ellas es la notacin O, que permite especificar la cota superior de la ejecucin de un algoritmo La sentencia f(n) es O(g(n)) significa que la tasa de crecimiento de f(n) no es mayor que la tasa de crecimiento de g(n) La notacin O sirve para clasificar las funciones de acuerdo con su tasa de crecimiento

La notacin O
Ejemplo: la funcin n2 no es O(n)
n2 cn n c La desigualdad anterior no puede satisfacerse porque c debe ser una constante

La notacin O
La notacin O proporciona una cota superior para la tasa de crecimiento de una funcin

f(n) es O(g(n)) g(n) crece ms f(n) crece ms Igual crecimiento S No S

g(n) es O(f(n)) No S S

30

La notacin O
Sea {g(n)} la clase (conjunto) de funciones que son O(g(n)) Se tiene: {n} {n2} {n3} {n4} {n5} donde la inclusin es estricta

{n3} {n2} { n}

La notacin O
Propiedades de O(f(n)):
Reflexiva: f(n)O(f(n)) Transitiva: si f(n) O(g(n)) y g(n) O(h(n)), entonces f(n) O(h(n)) Eliminacin de constantes: O(cf(n)) = O(f(n)), para todo c. O(logan) = O(logbn), para todo a y b. Suma de rdenes: O(f(n)+g(n)) = O(max(f(n),g (n)) Producto de rdenes: O(f(n))O(g(n)) = O(f(n) g (n))

La notacin O

O(1) O(log n) O(n) O(nlog n) O(n2) O(n3) O(nk) k>3 O(kn) k>1 O(n!)

Jerarqua de rdenes de complejidad


Constante Logartmica Lineal Casi lineal Cuadrtica Cbica Polinmica Exponencial Factorial Algunos algoritmos de grafos Intratable No depende del tamao del problema Bsqueda binaria Bsqueda lineal Quick-sort Algoritmo de la burbuja Producto de matrices Tratable Eficiente

La notacin O
Jerarqua de rdenes de complejidad

La notacin O
Cambios en el entorno HW o SW afectan a factores constantes (principio de invarianza) pero no al orden de complejidad O(f(n)) Hay que buscar algoritmos con el menor orden de complejidad La eficiencia es un trmino relativo que depende del problema El anlisis de la eficiencia es asinttico slo es vlido para tamaos de problema suficientemente grandes

La notacin O
El anlisis asinttico de algoritmos determina el tiempo de ejecucin en notacin O Para realizar el anlisis asinttico
Buscar el nmero de operaciones primitivas ejecutadas en el peor de los casos como una funcin del tamao de la entrada Expresar esta funcin con la notacin O

Ejemplo:
Se sabe que el algoritmo maximoArray ejecuta como mucho 7n - 1 operaciones primitivas Se dice que maximoArray ejecuta en un tiempo O(n)

Como se prescinde de los factores constantes y de los trminos de orden menor, se puede hacer caso omiso de ellos al contar las operaciones primitivas

La notacin O
Reglas:
Si f(n) es un polinomio de grado d, entonces f(n) es O (nd), es decir, 1. Prescindir de los trminos de orden menor 2. Prescindir de los factores constantes Usar la clase ms pequea posible de funciones Decir 2n es O(n) en vez de 2n es O(n2) Usar la expresin ms simple para la clase Decir 3n + 5 es O(n) en vez de 3n + 5 es O(3n)

La notacin O
Reglas prcticas:
Operaciones primitivas: O(1) Secuencia de instrucciones: mximo de la complejidad de cada instruccin (regla de la suma) Condiciones simples: Tiempo necesario para evaluar la condicin ms el requerido para ejecutar la consecuencia (peor caso). Condiciones alternativas: Tiempo necesario para evaluar la condicin ms el requerido para ejecutar el mayor de los tiempos de las consecuencias (peor caso).

La notacin O
Reglas prcticas:
Bucle con iteraciones fijas: multiplicar el nmero de iteraciones por la complejidad del cuerpo (regla del producto). Bucle con iteraciones variables: Igual pero ponindose en el peor caso (ejecutar el mayor nmero de iteraciones posible). Llamadas a subprogramas, funciones o mtodos: Tiempo de evaluacin de cada parmetro ms el tiempo de ejecucin del cuerpo.

La notacin O
Ejemplo de anlisis asinttico para dos algoritmos de clculo de medias prefijas

La media prefija i-sima de un array X es la media de los primeros (i + 1) elementos de X A[i] = X[0] + X[1] + + X[i]/(i +1)
Computar el array A de medias prefijas de otro array X tiene aplicaciones en anlisis financiero

La notacin O
Medias prefijas (Cuadrtico)
mediasPrefijas1(vector,n) vector INICIO A nuevo Array de n enteros i0 MIENTRAS (i < n) s X[0] j1 MIENTRAS (j <= i) s s + X[j] jj+1 FIN-MIENTRAS A[i] s / (i + 1) ii+1 FIN-MIENTRAS DEVOLVER A FIN OPERACIONES n 1 n+1 n n 1,2,3,4,,n 1,2,3,,n-1 1,2,3,,n-1 n n n 1

Tiempo de ejecucin = O(7n +3 + (n +1)n/2 + 2(n-1+1)n/2) O(n2)

La notacin O
Medias prefijas (Lineal)
mediasPrefijas2(vector,n) vector INICIO A nuevo Array de n enteros s0 i0 MIENTRAS (i < n) s s + X[j] A[i] s / (i + 1) ii+1 FIN-MIENTRAS DEVOLVER A FIN OPERACIONES n 1 1 n+1 n n n n 1

Tiempo de ejecucin = O(n)

Anlisis del caso mejor, peor y medio


El tiempo de ejecucin de un algoritmo puede variar con los datos de entrada. Ejemplo (ordenacin por insercin): :
INICIO i1 MIENTRAS (i < n) x T[i] ji-1 MIENTRAS (j > 0 Y T[j] > x) T[j+1] T[j] jj-1 FIN-MIENTRAS T[j+1] x ii+1 FIN-MIENTRAS FIN

Anlisis del caso mejor, peor y medio


Si el vector est completamente ordenado (mejor caso) el segundo bucle no realiza ninguna iteracin Complejidad O(n).

Anlisis del caso mejor, peor y medio


Si el vector est ordenado de forma decreciente, el peor caso se produce cuando x es menor que T[j] para todo j entre 1 e i -1. En esta situacin la salida del bucle se produce cuando j = 0. En este caso, el algoritmo realiza i 1 comparaciones. Esto ser cierto para todo valor de i entre 1 y n -1 si el orden es decreciente. El nmero total de comparaciones ser:

Anlisis del caso mejor, peor y medio


La complejidad en el caso promedio estar entre O (n) y O(n2). Para hallarla habra que calcular matemticamente la complejidad de todas las permutaciones de todos valores que se pueden almacenar en el vector. Se puede demostrar que es O(n2).

Вам также может понравиться