EDA Clase 2 An Lisis de Algoritmos

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 36

Análisis de Algoritmos y Estructuras de Datos

Clase 02: Análisis de algoritmos

Luis Celedón

Universidad de Santiago de Chile

2021

1/36
Notación O

En la clase pasada vimos...


I Introducción al análisis de algoritmos
I Calcular el T(n)
I Calcular el orden con notación O

2/36
Notación O

Ejemplo 1: Orden constante


m o s t r ar Prim erEl e m e n t o ( A [ n ]: entero )
imprimir ( A [0])
T (n) = 1 ∼ O(1)

3/36
Notación O

Ejemplo 2: Orden lineal


m o s t r ar Todo sEle m e n t o s ( A [ n ]: entero )
Para i desde 0 hasta n hacer :
imprimir ( A [ i ])
T (n) = n · 1 ∼ O(n)

4/36
Notación O

Ejemplo 3: Orden cuadrático


mostrarPares ( A [ n ]: entero )
Para i desde 0 hasta n hacer :
Para j desde 0 hasta n hacer :
imprimir ( A [ i ] , A [ j ])
T (n) = n · n · 1 ∼ O(n2 )

5/36
Notación O

Ejemplo 4: Adiós a las constantes


f u n c i o n Q u e N o H a c e N a d a I m p o r t a n t e ( A [ n ]: entero )
imprimir ( A [0])

Para i desde 0 hasta n /2 hacer :


imprimir ( A [ i ])

Para i desde 0 hasta 100 hacer :


imprimir ( " hola " )
T (n) = 1 + n/2 + 100 ∼ O(n)

6/36
Notación O

Ejemplo 5: Adiós a los términos menos significativos


cualquierCosa ( A [ n ]: entero )
max <- null
Para cada elem en A hacer :
max = maximo ( elem , max )
imprimir max

Para cada elem1 en A hacer :


Para cada elem2 en A hacer :
imprimir ( elem1 , elem2 )
T (n) = n + n2 ∼ O(n2 )

7/36
Complejidad de algoritmos secuenciales e iterativos

Ejemplo: multiplicación de matrices


I El problema de multiplicar dos matrices A ∈ M(nxp) y
B ∈ M(pxm) se puede resolver mediante el siguiente algoritmo

m u l t i p l i c a c i o n M a t r i z ( A [ n ][ p ]: numero , B [ p ][ m ]: numero ): numero [ n ][ m ]


Para i desde 1 hasta n hacer :
Para j desde 1 hasta m hacer :
C [ i ][ j ] = A [ i ][1] + B [1][ j ]

Para k desde 2 hasta p hacer :


C [ i ][ j ] = C [ i ][ j ] + A [ i ][ k ] + B [ k ][ j ]

Devolver C

8/36
Complejidad de algoritmos secuenciales e iterativos

Ejemplo: multiplicación de matrices


I Se observan tres ciclos Para anidados
I El primero se ejecuta n veces
I Por cada vez que se ejecuta el primero, el segundo ciclo se
ejecuta m veces
I Por cada vez que se ejecuta el segundo ciclo, se tiene una
instrucción básica y un tercer ciclo que se ejecuta p-1 veces

9/36
Complejidad de algoritmos secuenciales e iterativos

Ejemplo: multiplicación de matrices


I T (n, m, p) ∼ O(n · m · p)
I Caso particular n = m = p → T (n) ∼ O(n3 )

En este caso, la complejidad del mejor caso es igual a la


complejidad del peor caso y a la complejidad del caso medio, ya
que cualquiera sea la entrada el algoritmo ejecuta todos los pasos.

10/36
Complejidad de algoritmos secuenciales e iterativos

I Habı́a quedado establecido que las instrucciones básicas son


aquellas cuyo tiempo de ejecución está acotado superiormente
por una constante que solo depende de la implementación
usada
I Sin embargo, en los ejemplos anteriores pareciera que no se
hubiese considerado la condición de la sentencia Si o de los
ciclos Para y Mientras, o bien que se hubiese considerado
como instrucción simple a alguna sentencia que en realidad
contiene varias operaciones

11/36
Complejidad de algoritmos secuenciales e iterativos

x = 3 * ( 5 + x ) / ( - y - 6)

t0 = 5 + x
t1 = 3 * t0
t2 = -y
t3 = t2 - 6
x = t1 / t3

12/36
Complejidad de algoritmos secuenciales e iterativos

x != 3 && x < 8

0: si x != 3 saltar a 3
1: t0 = falso
2: saltar a 4
3: t0 = verdadero
4: si x < 8 saltar a 7
5: t1 = falso
6: saltar a 8
7: t1 = verdadero
8: t2 = t0 and t1

13/36
Complejidad de algoritmos secuenciales e iterativos

Ejemplo: factorial
I El factorial de un número natural n se define por la
multiplicación de números naturales sucesivos desde 1 hasta
n : n! = 1 · 2 · 3 · ... · n. Puede ser calculado iterativamente
como se muestra a continuación
Factorial ( n : entero ): entero
factorial = 1
Para i desde 2 hasta n hacer :
factorial = factorial * i
Devolver factorial

14/36
Complejidad de algoritmos secuenciales e iterativos

Ejemplo: factorial
I Asignación, tiempo constante
I Ciclo Para que se ejecuta n-1 veces
I Dentro del ciclo, asignación con tiempo constante
I Sentencia de retorno con tiempo constante

15/36
Complejidad de algoritmos secuenciales e iterativos

Ejemplo: factorial
I T (n) = c + c · (n − 1) + c = c · (n + 1)
I T (n) ∼ O(n)

16/36
Complejidad de algoritmos secuenciales e iterativos

Ejemplo: llamados a funciones


I A continuación se calcula la sumatoria de los factoriales de los
n primeros números naturales, usando para ello la función
definida anteriormente
SumaFactorial ( n : entero ): entero
suma <- 0
Para i desde 1 hasta n hacer :
suma = suma + Factorial ( i )
Devolver suma

17/36
Complejidad de algoritmos secuenciales e iterativos

Ejemplo: llamados a funciones


I Asignación con tiempo constante
I Ciclo Para que se ejecuta n veces
I Dentro del ciclo, una suma con tiempo constante y una
llamada a la función que calcula el factorial para la que es
sabido que su complejidad es O(n)
I Sentencia de retorno con tiempo constante

18/36
Complejidad de algoritmos secuenciales e iterativos

Ejemplo: llamados a funciones


I T (n) = c + n · (c + n) + c = n2 + c · n + c
I T (n) ∼ O(n2 )

19/36
Complejidad de algoritmos secuenciales e iterativos

Suponga que la entrada de cierto problema π tiene tamaño n y


que, para resolverlo se encuentra en la literatura las siguientes
alternativas
1. Algoritmo de tiempo O(n3 )
2. Algoritmo de tiempo O(n) + O(n log n)
3. Algoritmo de tiempo O(n2 )

Se debe elegir la alternativa cuyo valor de función sea menor, esto


es, porque el algoritmo elegido debe ser el más rápido, es decir que
ocupe menor tiempo de ejecución. Luego, la alternativa elegida es
la 2.

20/36
Complejidad de algoritmos secuenciales e iterativos

I Un algoritmo es eficiente si su complejidad es un polinomio de


la entrada, es decir, es de la forma T (n) ∼ O(n · k), donde k
es una constante
I Para algunos problemas es posible determinar el lı́mite inferior
del problema que corresponde al tiempo mı́nimo para
resolverlo. Este lı́mite es una caracterı́stica del problema y
refleja su dificultad intrı́nseca para resolverlo. Cualquier
algoritmo que lo resuelva utilizará por lo menos ese tiempo
I Un algoritmo es óptimo si su complejidad es ∼ O(L), donde L
es el lı́mite inferior del problema

21/36
Complejidad de algoritmos recursivos

¿Qué es recursión?

22/36
Complejidad de algoritmos recursivos

(
n · (n − 1)! n>1
Factorial(n) =
1 n = 0, 1

FactorialR ( n : entero ): entero


Si n == 0 o n == 1 hacer :
Devolver 1
Sino :
Devolver n * FactorialR (n -1)

23/36
Complejidad de algoritmos recursivos

(
T (n − 1) + c n>1
T (n) =
c n = 0, 1

24/36
Complejidad de algoritmos recursivos

T (n) = T (n − 1) + c
T (n) = T (n − 2) + c + c = T (n − 2) + 2c
T (n) = T (n − 3) + c + c + c = T (n − 3) + 3c
...
T (n) = T (n − k) + kc

Cuando k = n − 1 se tiene que

T (n) = T (1) + (n − 1)c


T (n) = c + cn − c
T (n) = n ∼ O(n)

25/36
Complejidad de algoritmos recursivos

(
Fib(n − 1) + Fib(n − 2) n > 1
Fib(n) =
1 n = 0, 1

FiboR ( n : entero ): entero


Si n == 0 o n == 1 hacer :
Devolver 1
Sino :
Devolver FiboR (n -1) + FiboR (n -2)

26/36
Complejidad de algoritmos recursivos

(
T (n − 1) + T (n − 2) n > 1
T (n) =
c n = 0, 1

27/36
Complejidad de algoritmos recursivos

FiboI ( n : entero ): entero


Si n = 0 o n = 1 hacer :
Devolver 1
penultimo <- 1
ultimo <- 1
Para i desde 2 hasta n hacer :
termino = penultimo + ultimo
penultimo = ultimo
ultimo = termino
Devolver termino

T (n) ∼ O(n)

28/36
Complejidad de algoritmos recursivos

Reducción por sustracción


I Si el tamaño n del problema decrece en una cantidad
constante b en cada llamada, se realizan a llamadas recursivas
y las operaciones correspondientes a la parte no recursiva del
algoritmo toman un tiempo O(nk ), entonces

T (n) = aT (n − b) + O(nk ) si n ≥ b

29/36
Complejidad de algoritmos recursivos

Reducción por sustracción


k
n
 a<1
O( ) = nk+1 a=1
 bn

a a>1

30/36
Complejidad de algoritmos recursivos

Reducción por sustracción


I T (n) = T (n − 1) + T (n − 2) + O(1)
I T (n) = 2T (n − 1) + O(n0 )
I a = 2, b = 1 y k = 0 → T (n) ∼ O(2n )

31/36
Complejidad de algoritmos recursivos

Reducción por división


I Si el algoritmo con un problema de tamaño n realiza a
llamadas recursivas con subproblemas de tamaño n/b y las
operaciones correspondientes a la parte no recursiva, que
corresponde a descomponer el problema en subproblemas y
luego combinar las soluciones de éstos, toman un tiempo
O(nk ), entonces

T (n) = aT ( bn ) + O(nk ) si n ≥ b

32/36
Complejidad de algoritmos recursivos

Reducción por división


k a < bk
n

O( ) = nk log n a = bk

 logb a
n a > bk

33/36
Ejercicios

1. T (n) = 3T (n − 1)
2. T (n) = T (n − 1) + n(n − 1)
3. T (n) = 3T ( n2 ) + n2
4. T (n) = 2n T ( n2 ) + nn
5. T (n) = 3T ( n3 ) + n
2

34/36
Ejercicios

1. T (n) = 3T (n − 1) → O(3n )
2. T (n) = T (n − 1) + n(n − 1) → O(n3 )
3. T (n) = 3T ( n2 ) + n2 → O(n2 )
4. T (n) = 2n T ( n2 ) + nn → No aplica
5. T (n) = 3T ( n3 ) + n
2 → n log n

35/36
Preguntas?

36/36

También podría gustarte