Análisis de algoritmos

Documentos relacionados
Introducción al Análisis del Coste de Algoritmos

Estructura de Datos. Complejidad de Algoritmos. Algoritmo. Algoritmo. Mauricio Solar Lorna Figueroa

Notación Asintótica. Temas. Introducción Notación O Notación Omega Notación Theta. Análisis de Algoritmos

Complejidad de los Algoritmos

Análisis y Diseño de Algoritmos

Tema 01: Fundamentos del Análisis Asintótico de Algoritmos

Programación II. Mario Aldea Rivas Programación II 04/04/11 1. Mario Aldea Rivas Programación II 04/04/11 2

Análisis de algoritmos

1. Introducción al análisis de algoritmos

La eficiencia de los programas

Análisis y Diseño de Algoritmos. Complejidad Computacional

Complejidad computacional y asintótica

Conceptos Fundamentales del Análisis de Algoritmos II

Programación 2. Lección 8. Caracterización asintótica de la eficiencia de un algoritmo

1. 1. Introducción al concepto de algoritmia

Análisis de algoritmos

Complejidad computacional. Algoritmos y Estructuras de Datos I. Complejidad computacional. Notación O grande

Algorítmica y Lenguajes de Programación. Eficiencia y notación asintótica (ii)

Estructuras de Datos y Algoritmos

Algoritmos y Estructuras de Datos Tema 2: Diseño de Algoritmos

NOTACIÓN O GRANDE. El análisis de algoritmos estima el consumo de recursos de un algoritmo.

Tema 3. Análisis de costes

Análisis de algoritmos

ELO320 Estructuras de Datos y Algoritmos. Complejidad. Tomás Arredondo Vidal

dit UPM Tema 1: Algoritmos /complejidad /java Análisis y diseño de software José A. Mañas

Tema 2 Fundamentos de Complejidad Algorítmica

Algoritmos y Complejidad

Técnicas y Herramientas. Algoritmos y Complejidad. Técnicas de Demostración. Técnicas y Herramientas. Herramientas Matemáticas Básicas

Temario. Tipos de recursión. Eficiencia y recursión

Análisis de algoritmos

Algoritmos Iterativos de Búsqueda y Ordenación y sus tiempos

Complejidad de algoritmos recursivos

Notación Asintótica 2

Tema 10: Árbol binario de búsqueda

Tema 06: Recursividad

COMPLEJIDAD Y EFICIENCIA DE ALGORITMOS

Tiempo de Ejecución. Midiendo el Tiempo de Ejecución

Análisis de Algoritmos

Análisis de Algoritmos

Diseño y Análisis de Algoritmos

Notación Asintótica. Programación Avanzada

ALGORITMOS INTRODUCCIÓN ALGORITMOS INTRODUCCIÓN AL ANÁLISIS Y AL DISEÑO DE AL ANÁLISIS Y AL DISEÑO DE UNIVERSIDAD AUTÓNOMA METROPOLITANA

Recursividad. Dept. Ciencias de la Computación e I.A. Universidad de Granada

Algorítmica y Lenguajes de Programación. Eficiencia y notación asintótica (i)

Multiplicación de matrices simétricas

Análisis de algoritmos

Análisis de algoritmos.

Introducción y Comportamiento Asintótico

Complejidad de Algoritmos

Tema 5- Diseño Recursivo y Eficiente. Tema 5- Diseño Recursivo y. Descomposición recursiva ascendente de un vector. Etapas del diseño recursivo

Tema 9. Recursividad

Tema 06: Estructuras y sentencias de control en C

Introducción al análisis de algoritmos

TEMA 1 La eficiencia de los algoritmos

1. Algoritmo, programa y pseudocódigo. Introducción al estudio de algoritmos. Ejemplos

Algoritmos y Complejidad

Capítulo 4. Control de flujo. Continuar

Universidad de Valladolid. Departamento de informática. Campus de Segovia. Estructura de datos Tema 1: Recursividad. Prof. Montserrat Serrano Montero

Estructura de Datos. Recursividad. Primer Semestre, Indice

Algoritmos y Estructuras de Datos Tema 2: Diseño de Algoritmos

Arreglos. Algoritmos y Estructuras de Datos I. Arreglos en C++ Arreglos y listas

Introducción. Algoritmos y Complejidad. Algoritmos y Algoritmia. Introducción. Problemas e instancias. Pablo R. Fillottrani

Tema 02: Algoritmia y pseudocódigo

Tema 3.2: Eficiencia de algoritmos recursivos. Diseño y Análisis de Algoritmos

Agradecimientos. Nota de los autores. 1 Problemas, algoritmos y programas 1

Qué es la recursividad?

Algoritmos de Ordenación

Algoritmos y Estructuras de Datos Curso 06/07. Ejercicios

Técnicas de diseño de algoritmos Divide y Vencerás

Analisis de algoritmos

Metodología de la Programación II. Recursividad

Estructuras de Datos y de la Información Ingeniería Técnica en Informática de Gestión. Curso 2007/2008 Ejercicios del Tema 2

Análisis de algoritmos

Parte I: El computador y el proceso de programación

Algoritmos Secuenciales y Recursivos

Estructuras de Datos. Clase 3 Análisis de algoritmos recursivos

Transcripción:

Tema 05: no recursivos M. en C. Edgardo Adrián Franco Martínez http://www.eafranco.com edfrancom@ipn.mx @edfrancom edgardoadrianfrancom 1

Contenido no recursivos La notación de Landau O La notación O Principio de invarianza del análisis asintótico Reglas prácticas del análisis de algoritmos Ordenes más comunes de los algoritmos Comportamiento de las funciones Análisis por bloques de algoritmos iterativos Regla 1: Secuencia de instrucciones Regla 2: Decisiones Regla 3: Ciclos Consideraciones especiales Logaritmos Propiedades de los logaritmos Ejemplos Ejemplo 01: Ordenamiento por intercambio Ejemplo 02: Multiplicación de matrices de n x n Ejemplo 03: Algoritmo de Horner Ejemplo 04: Fibonacci (Iterativo) Ejemplo 05: Búsqueda binaria 2

no recursivos El análisis de complejidad de los algoritmos no recursivos (iterativos) se realiza bajo los principios del peor caso y generalmente devolverá la cota superior ajustada del orden de este (O). En principio se considera válido cuando solo se desea obtener una cota para valores grandes de n, basándose en que se cumple el principio de invarianza del análisis asintótico. Para los algoritmos iterativos es únicamente necesario conocer los órdenes de complejidad O de las tres estructuras de control que todo algoritmo iterativo puede emplear. 3

La notación de Landau (O) Se dice que la función f(n) es de orden O g(n) [O(g(n))], si existen constantes positivas c y n 0 tales que f n c g n cuando n n 0 Ejemplos: n+5 es O(n) pues n+5 2n para toda n 5 (n+1) 2 es O(n 2 ) pues (n+1) 2 4n 2 para n 1 (n+1) 2 NO es O(n) pues para cualquier c > 1 no se cumple que (n+1) 2 c*n 4

La notación O La notación O proporciona una cota superior para la tasa de crecimiento de una función. La siguiente tabla muestra la relación asintótica de la notación de orden O. f(n) es O(g(n)) g(n) es O(f(n)) g(n) crece más Sí No f(n) crece más No Sí Igual crecimiento Sí Sí 5

Principio de invarianza del análisis asintótico Cambios en el entorno HW o SW afectan a factores constantes pero no al orden de complejidad O(f(n)) El análisis de la eficiencia es asintótico sólo es válido para tamaños de problema suficientemente grandes lo que hace valido el principio de invarianza. Dos implementaciones de un mismo algoritmo no diferirán más que en una constante multiplicativa Si f 1 (n) y f 2 (n) son los tiempos consumidos por dos implementaciones de un mismo algoritmo, se verifica que: Ǝ c, d R, f 1 (n) c f 2 (n) f 2 (n) d f 1 (n) 6

Reglas prácticas del análisis de algoritmos Operaciones primitivas: tienen complejidad constante O(1) Secuencia de instrucciones: máximo de la complejidad de cada instrucción (regla de la suma). Condiciones simples: operaciones necesarias para evaluar la condición más las requeridas para ejecutar la consecuencia (peor caso). Condiciones alternativas: operaciones necesarias para evaluar la condición más las operaciones requeridas para ejecutar el mayor número de operaciones de las consecuencias (peor caso). 7

Bucle con iteraciones fijas: multiplicar el número de iteraciones por la complejidad del cuerpo (regla del producto). Bucle con iteraciones variables: Igual pero poniéndose en el peor caso (ejecutar el mayor número de iteraciones posible). Llamadas a subprogramas, funciones o métodos: Operaciones de asignación de cada parámetro más las operaciones de ejecución del cuerpo, más el número de operaciones del retorno. 8

Ordenes más comunes de los algoritmos O(1) O(n) O(n 2 ) O(n 3 ) O (n m ) O(log(n)) O(nlog(n)) O(m n ) O(n!) Constante Lineal Cuadrático Cúbico Polinomial Logarítmico nlog (n) exponencial factorial 9

Comportamiento de las funciones 10

Análisis por bloques de algoritmos iterativos El análisis de complejidad por bloques proporciona un importante medio para hacer un análisis más dinámico, que se basa principalmente en el conocimiento del orden de los bloques de instrucciones. Un bloque de instrucciones puede ser un algoritmo del cual conocemos su complejidad computacional. Para determinar el orden de un bloque, es necesario tener en mente el orden de las estructuras de control más usuales. O(g 1 (n)) O(g 2 (n)) 11 O(g 3 (n))

El análisis por bloques implica el análisis de: 1. Secuencias de instrucciones 2. Condicionales 3. Ciclos O(g 1 (n)) O(g 2 (n)) O(g 1 (n)) O(g(n)) O(g 3 (n)) O(g 2 (n)) 12

Regla 1: Secuencia de instrucciones O(g 1 (n)) O(g 2 (n)) O(g 3 (n)) O(g m (n)) O( mayor(g 1 (n), g 2 (n),, g m (n) ) Ejemplo: Una secuencia de 3 ciclos: Ciclo 1 = O(n) Ciclo 2 = O(log n) Ciclo 3 = O(n 2 ) Tendrá como orden total O(n 2 ). 13

Regla 2: Decisiones O(g 2 (n)) O(g 1 (n)) O( mayor(g 1 (n), g 2 (n)) ) Ejemplo: Una decisión con: Bloque verdadero= O(n log n) Bloque falso= O(log n) Tendrá como orden total O(n log n). 14

Regla 3: Ciclos O(g(n)) Se repite m veces O( m * g(n) ) Ejemplo: Un ciclo cuya instrucción: Tiene un O(log n) Se repite n/2 veces Tendrá como orden total O(½ n log n) = O(n log n). 15

Consideraciones especiales En decisiones y ciclos anidados: Analizar el código desde la instrucción más interna hacia el más externa. Tips para los ciclos: Normalmente cuál es el orden de la instrucción interna? Si la variable de control se incrementa o decremento con un valor constante: Orden LINEAL. Si la variable de control se multiplica o divide por un valor constante: Orden LOGARÍTIMICO. 16

Ejemplo 01: Ordenamiento por intercambio for (int i=1; i<n; i++) for (int j=i+1; j<=n;j++) if (a[ j ] < a[ i ]) intercambia(a[ i ], a[ j ]); O( ) 1 O( 1 ) Regla 2: Decisiones = mayor de las 2 ramas 17

for (int i=1; i<n; i++) Peor caso: se repite n-1 veces for (int j=i+1; j<=n;j++) if (a[ j ] < a[ i ]) intercambia(a[ i ], a[ j ]); O( 1 ) n O( ) Regla 3: Ciclos = # veces * orden de la instrucción interna 18 Complejidad computacional (Edgardo A. Franco)

Se repite n-1 veces for (int i=1; i<n; i++) for (int j=i+1; j<=n;j++) if (a[ j ] < a[ i ]) intercambia(a[ i ], a[ j ]); O( n ) O( n 2 ) Regla 3: Ciclos = # veces * orden de la instrucción interna 19

Análisis espacial ff n = eeeeeee dd a ff(n) = n ee O(n) 49 12 56 90 2 5 11 32 22 7 99 02 35 1 20 20

Ejemplo 02: Multiplicación de matrices de n x n a 11 a 12 a 1n a 21 a 22 a 2n a n1 a n2 a nn X b 11 b 12 b 1n b 21 b 22 b 2n b n1 b n2 b nn = c 11 c 12 c 1n c 21 c 22 c 2n c n1 c n2 c nn c 11 = a 11 *b 11 +a 12 *b 21 + + a 1n *b n1 c 12 = a 11 *b 12 +a 12 *b 22 + + a 1n *b n2 c 21 = a 21 *b 11 +a 22 *b 21 + + a 2n *b n1 c nn = a n1 *b 1n +a n2 *b 2n + + a nn *b nn n c ij = Σ a ik b kj k=1 21

O( n 3 ) for i = 1 to n do O( n 2 ) for j = 1 to n do O( 1 ) O( n ) C[i,j] = 0; for k = 1 to n do O( 1 ) C[i,j] = C[i,j] + A[i,k]*B[k,j]; 22 Complejidad computacional (Edgardo A. Franco) 22

Análisis espacial ff n = eeeeeee dd n + eeeeeee dd (A, B, C) ff(n) = 1 + 3n 2 ee O(n 2 ) 3 A B C 23 23

Ejemplo 03: Algoritmo de Horner Sea A un vector de coeficientes y sea n Pn(z) = i=0 A[i] z i, un polinomio de grado n; evaluado para un argumento real z: Encontrar la función complejidad, temporal y espacial, para el algoritmo que evalúa Pn(z). 24

Algoritmo: Método de Horner Tamaño del Problema: n = grado del polinomio Operación básica: La multiplicación * (Se realiza un número de veces del mismo orden al tamaño del problema) Caso: El algoritmo hace el mismo número de operaciones en todos los casos. proc Horner(n,z,A) { polinomio=0; for(i=0;i<=n;i++) { polinomio=polinomio*z + A[n-i];* } } 25

polinomio=0; for(i=0; i<=n; i++) polinomio=polinomio*z + A[n-i]; O( n ) O( 1 ) 26

Análisis espacial ff n = eeeeeee dd n + eeeeeee dd ppppppppp + eeeeeee dd z + eeeeeee dd i + eeeeeee dd (A) fe(n) = 1 + 1 + 1 + 1 + n = 4 + n ee O(n) n p z i A 27 27

Ejemplo 04: Fibonacci (Iterativo) anterior = 1; --> 1 Asignación actual = 1; --> 1 Asignación while (n>2){ --> n-2 + 1 Condicionales aux = anterior + actual; --> n-2 Asignaciones anterior = actual; --> n-2 Asignaciones actual = aux; --> n-2 Asignaciones n = n - 1; --> n-2 Asignaciones } --> n-2+1 Saltos implicitos return (actual); --> 1 Asignación T(n) = 6n-7=O(n) 28 Complejidad computacional (Edgardo A. Franco) 28

Ejemplo 05: Búsqueda binaria BusquedaBinaria(A,n,dato) inferior=0; O( 1 ) superior=n-1; while(inferior<=superior) centro=(superior+inferior)/2; if(a[centro]==dato) return centro; else if(dato < A[centro] ) superior=centro-1; else inferior=centro+1; return -1; O(log 2 n) 29 Complejidad computacional (Edgardo A. Franco) 29