10
1 Complejidad Carlos Delgado Kloos Ingeniería Telemática Univ. Carlos III de Madrid [email protected] Java: Complejidad / 1 Comparación long fib (int n) long fibo (int {if (n<=1) return n; else return fib(n-1)+fib(n-2); } n,x,y) {if (n<=1) return x+y; else return fibo(n-1,y,x+y); } } [email protected] Java: Complejidad / 2 Los dos métodos calculan la función fib correctamente, ¿pero cuál preferiría? El primero es más claro. El segundo es más eficiente.

Complejidad Algoritmica

Embed Size (px)

DESCRIPTION

Como Se Mide La Complejidad Algorítmica

Citation preview

  • 1Complejidad

    Carlos Delgado KloosIngeniera TelemticaUniv. Carlos III de Madrid

    [email protected] Java: Complejidad / 1

    Comparacin

    a long fib (int n) a long fibo (int {if (n

  • 2Cmo medimos?

    aMidiendo el tiempo de ejecucin (enaMidiendo el tiempo de ejecucin (en funcin del tamao de la entrada)No podemos probar con todas las entradasEs necesario implementar el algoritmoDepende del software y el hardware

    aBusquemos otra medidaaBusquemos otra medidaMs abstractaMs fcil de obtener

    [email protected] Java: Complejidad / 3

    Cmo medimos?

    aAsociamos a cada algoritmo: f(n)aAsociamos a cada algoritmo: f(n)aEmplearemos el caso peor para

    caracterizar el tiempo de ejecucinaEs ms fcil de calcularaInteresa la velocidad de crecimiento del

    tiempo de ejecucin en funcin del

    Tamao de la entrada

    tiempo de ejecucin en funcin del tamao de la entradaaComportamiento asinttico

    [email protected] Java: Complejidad / 4

  • 3Cmo medimos?

    aAsociamos a cada operacin primitiva un tiempo aAsociamos a cada operacin primitiva un tiempo de ejecucin constante:AsignacinLlamada a mtodoOperacin aritmtica, etc.Indexacin en arraySeguir una referenciaVolver de un mtodoEtc.

    [email protected] Java: Complejidad / 5

    Ejemplo(en pseudocdigo)

    aHallar el mximo de un arrayyaEntrada: un array A con n enterosaSalida: el elemento mayor de AaAlgoritmo: arrayMax(A,n)acurrent=A[0]for i=1 to n-1 do

    if current

  • 4Ejemplo(en pseudocdigo)

    acurrent=A[0][ ]for i=1 to n-1 do

    if current

  • 5Notacin O

    a7n-3 es O(n)a7n 3 es O(n)c=7, n0=17n-3 7n

    a20n3+10n log n+5 es O(n3)a3 log n + log log n es O(log n)g g g ( g )a2100 es O(1)a5/n es O(1/n)

    [email protected] Java: Complejidad / 9

    Crecimientode funciones

    log n n n n log n n2 n3 2nlog n n n n log n n n 21 1,4 2 2 4 8 4

    2 2,0 4 8 16 64 16

    3 2,8 8 24 64 512 256

    4 4,0 16 64 256 4.096 65.536

    5 5,7 32 160 1.024 32.768 4.294.967.296

    6 8,0 64 384 4.096 262.144 1,8 * 1019

    7 11,0 128 896 16.536 2.097.152 3,4 * 1038

    [email protected] Java: Complejidad / 10

  • 6Crecimientode funciones

    [email protected] Java: Complejidad / 11

    Tamao mximode un problema

    Tiempo de 1 d 1 i t 1 hTiempo de ejecucin 1 segundo 1 minuto 1 hora

    400n 2.500 150.000 9.000.000

    20nlog n 4.096 166.666 7.826.0872n2 707 5 477 42 4262n 707 5.477 42.426

    n4 31 88 244

    2n 19 25 31

    [email protected] Java: Complejidad / 12

  • 7Actividad

    aVer videoaVer videowww.youtube.com/watch?v=hM1x4RljmnE

    [email protected] Java: Complejidad / 13

    Ejemplo

    aDado un array A de n nmerosaDado un array A de n nmerosaCalcular otro array B, tal que:

    ij=0A[j]B[i]=

    i+1

    [email protected] Java: Complejidad / 14

  • 8Solucin 1

    afor i=0 to n-1 doa=0for j=0 to i do

    a=a+A[j]B[i]=a/(i+1)

    return B

    [email protected] Java: Complejidad / 15

    Solucin 1: Anlisis

    aPartes:aPartes:Inicializar y devolver array B: O(n)Bucle i: se ejecuta n vecesBucle j: se ejecuta 1+2+3+...+n=n(n+1)/2

    veces: O(n2)

    aTotal:O(n)+O(n)+O(n2)= O(n2)Orden cuadrtico

    [email protected] Java: Complejidad / 16

  • 9Optimizacin

    aB[i]=(A[0]+...+A[i])/(i+1)[ ] ( [ ] [ ])/( )aB[i+1]=(A[0]+...+A[i]+A[i+1])/(i+2)

    aB[i+1]=(B[i]*(i+1))+A[i+1]/(i+2)

    [email protected] Java: Complejidad / 17

    Solucin 2

    as=0for i=0 to (n-1) do

    s=s+A[i]B[i]=s/(i+1)

    return B

    [email protected] Java: Complejidad / 18

  • 10

    Solucin 2: Anlisis

    aPartes:aPartes:Inicializar y devolver array B: O(n)Inicializar s: O(1)Bucle i: se ejecuta n veces

    aTotal:O(n)+O(1)+O(n)=O(n)Orden lineal

    [email protected] Java: Complejidad / 19